﻿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
19073	strange behaviour of select_related	anonymous	nobody	"Sometimes Django uses inner join instead of left outer join in queries with select_related. This breaks queries with nullable OneToOne fields.
Here's the example

models:
{{{
class A(models.Model):
    pass

class B(models.Model):
    pass

class C(models.Model):
    b = models.OneToOneField(B)
    a = models.ForeignKey(A)

class D(models.Model):
    b = models.OneToOneField(B, null=True)
}}}

code
{{{
D.objects.all()
[<D: D object>, <D: D object>, <D: D object>] #ok
>>> D.objects.select_related('b').all()
[<D: D object>, <D: D object>, <D: D object>] #ok
>>> D.objects.select_related('b', 'b__c').all()
[<D: D object>, <D: D object>, <D: D object>] #ok
>>> D.objects.select_related('b', 'b__c__a').all()
[] #WRONG! empty result
>>> print D.objects.select_related('b', 'b__c__a').all().query
SELECT ""app1_d"".""id"", ""app1_d"".""b_id"", ""app1_b"".""id"", ""app1_c"".""id"", ""app1_c"".""b_id"", ""app1_c"".""a_id"", ""app1_a"".""id"" FROM ""app1_d"" LEFT OUTER JOIN ""app1_b"" ON (""app1_d"".""b_id"" = ""app1_b"".""id"") LEFT OUTER JOIN ""app1_c"" ON (""app1_b"".""id"" = ""app1_c"".""b_id"") INNER JOIN ""app1_a"" ON (""app1_c"".""a_id"" = ""app1_a"".""id"")

}}}

'''INNER JOIN ""app1_a""''' should be '''LEFT OUTER JOIN ""app1_a""''' imo
"	Bug	closed	Database layer (models, ORM)	1.4	Normal	worksforme			Unreviewed	0	0	0	0	0	0
