Django version 1.11.3
Python 2.7
reproducible steps:
**1) django-admin startproject pk_string**
**2) cd pk_string**
**3) django-admin startapp users**
**4) update users.models**
{{{#!python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class User(models.Model):
email = models.CharField(max_length=255, unique=True)
class UserData(models.Model):
email = models.OneToOneField(User, to_field='email', primary_key=True)
note = models.CharField(max_length=255);
}}}
**5) install app pk_string.settings**
{{{#!python
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
]
...
}}}
**6) ./manage.py makemigrations**
**7) ./manage.py migrate**
**8) ./manage.py shell**
{{{#!python
from users.models import User, UserData
User.objects.create(email = '111111')
User.objects.create(email = '222222')
User.objects.create(email = '333333')
User.objects.create(email = '444444')
users = User.objects.all().prefetch_related('userdata')
users[0]
>>> "<User: User object>"
UserData.objects.create(email=users[0] , note = '111')
UserData.objects.create(email=users[2] , note = '222')
UserData.objects.create(email=users[3] , note = '333')
users = User.objects.all().prefetch_related('userdata')
>>> users[0]
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 289, in __getitem__
return list(qs)[0]
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 250, in __iter__
self._fetch_all()
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 1120, in _fetch_all
self._prefetch_related_objects()
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 675, in _prefetch_related_objects
prefetch_related_objects(self._result_cache,
*self._prefetch_related_lookups)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 1469, in prefetch_related_objects
obj_list, additional_lookups = prefetch_one_level(obj_list,
prefetcher, lookup, level)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 1582, in prefetch_one_level
prefetcher.get_prefetch_queryset(instances,
lookup.get_current_queryset(level)))
File "/usr/local/lib/python2.7/site-
packages/django/db/models/fields/related_descriptors.py", line 362, in
get_prefetch_queryset
instance = instances_dict[rel_obj_attr(rel_obj)]
KeyError: u'111111'
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28375>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* Attachment "pk_string.tar.gz" added.
Project example source code. So you could skip all steps and begin from
the last step to reproduce the issue.
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:1>
* owner: nobody => Paulo
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:2>
Comment (by Paulo):
Hello Tim,
Will a fix for this be backported to 1.11?
If that is the case, then I can make sure to base if off of current master
instead of https://github.com/django/django/pull/6721
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:3>
Comment (by Tim Graham):
A fix could be backported if the patch is simple and the risk of
introducing a regression seems low.
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:4>
* has_patch: 0 => 1
Comment:
PR: https://github.com/django/django/pull/8905
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:5>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"fea9cb46aacc73cabac883a806ccb7fdc1f979dd" fea9cb4]:
{{{
#!CommitTicketReference repository=""
revision="fea9cb46aacc73cabac883a806ccb7fdc1f979dd"
Fixed #28375 -- Fixed KeyError crash on reverse prefetch of a model with
OneToOneField primary key to a non-pk field.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28375#comment:6>