﻿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
22650	Regression from f51c1f59 with select_related + prefetch_related	Aymeric Augustin	loic84	"If a queryset does:

- select_related through a reverse one-to-one
- prefetch_related through that one-to-one then another relation

and some objects don't have a related object through the reverse one-to-one, iterating the queryset raises an exception.

This is easier to demonstrate with a test case:

{{{#!diff
diff --git a/tests/prefetch_related/models.py b/tests/prefetch_related/models.py
index 8fec5d4..ef2eeb7 100644
--- a/tests/prefetch_related/models.py
+++ b/tests/prefetch_related/models.py
@@ -66,6 +66,11 @@ class BookWithYear(Book):
         AuthorWithAge, related_name='books_with_year')
 
 
+class Bio(models.Model):
+    author = models.OneToOneField(Author)
+    books = models.ManyToManyField(Book, blank=True)
+
+
 @python_2_unicode_compatible
 class Reader(models.Model):
     name = models.CharField(max_length=50)
diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py
index 6732e45..0cdd8db 100644
--- a/tests/prefetch_related/tests.py
+++ b/tests/prefetch_related/tests.py
@@ -9,7 +9,7 @@ from django.test import TestCase, override_settings
 from django.utils import six
 from django.utils.encoding import force_text
 
-from .models import (Author, Book, Reader, Qualification, Teacher, Department,
+from .models import (Author, Bio, Book, Reader, Qualification, Teacher, Department,
     TaggedItem, Bookmark, AuthorAddress, FavoriteAuthors, AuthorWithAge,
     BookWithYear, BookReview, Person, House, Room, Employee, Comment,
     LessonEntry, WordEntry, Author2)
@@ -192,6 +192,9 @@ class PrefetchRelatedTests(TestCase):
                                      [""Amy""],
                                      [""Amy"", ""Belinda""]])
 
+    def test_reverse_one_to_one_then_m2m(self):
+        list(Author.objects.prefetch_related('bio__books').select_related('bio'))
+
     def test_attribute_error(self):
         qs = Reader.objects.all().prefetch_related('books_read__xyz')
         with self.assertRaises(AttributeError) as cm:
}}}

This test fails with:

{{{
Traceback (most recent call last):
  File ""/Users/myk/Documents/dev/django/tests/prefetch_related/tests.py"", line 196, in test_reverse_one_to_one_then_m2m
    list(Author.objects.prefetch_related('bio__books').select_related('bio'))
  File ""/Users/myk/Documents/dev/django/django/db/models/query.py"", line 141, in __iter__
    self._fetch_all()
  File ""/Users/myk/Documents/dev/django/django/db/models/query.py"", line 965, in _fetch_all
    self._prefetch_related_objects()
  File ""/Users/myk/Documents/dev/django/django/db/models/query.py"", line 608, in _prefetch_related_objects
    prefetch_related_objects(self._result_cache, self._prefetch_related_lookups)
  File ""/Users/myk/Documents/dev/django/django/db/models/query.py"", line 1793, in prefetch_related_objects
    elif isinstance(getattr(first_obj, through_attr), list):
  File ""/Users/myk/Documents/dev/django/django/db/models/fields/related.py"", line 420, in __get__
    self.related.get_accessor_name()
RelatedObjectDoesNotExist: Author has no bio.
}}}

The regression exists in master and 1.7.x."	Bug	closed	Database layer (models, ORM)	1.7-beta-2	Release blocker	fixed			Ready for checkin	1	0	0	0	0	0
