﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28375	QuerySet.prefetch_related() crashes with KeyError if model uses to_field and string primary key	Maks Y	Paulo	"The issue:
prefetch_related failed if prefetching by char primary key. 

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'
}}} 
"	Bug	closed	Database layer (models, ORM)	1.11	Normal	fixed	prefetch_related string primary key.		Accepted	1	0	0	0	0	0
