﻿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
17502	Filter on field from base class 2 levels up hierarchy causes extra join	dbenamy@…	Łukasz Rekucki	"Here's some simple code showing a 3 level concrete inheritance structure:
{{{
from django.db import models

class A(models.Model):
    alice = models.IntegerField()

class B(A):
    bob = models.IntegerField()

class C(B):
    charlie = models.IntegerField()
}}}

Filtering C objects on an attribute in B or C works fine. Filtering C objects on an attribute in A seems to cause an extra join to A. Is there some reason this is needed?
{{{
In [3]: str(C.objects.all().query)
Out[3]: 'SELECT ""case1_a"".""id"", ""case1_a"".""alice"", ""case1_b"".""a_ptr_id"", ""case1_b"".""bob"", ""case1_c"".""b_ptr_id"", ""case1_c"".""charlie"" FROM ""case1_c"" INNER JOIN ""case1_a"" ON (""case1_c"".""b_ptr_id"" = ""case1_a"".""id"") INNER JOIN ""case1_b"" ON (""case1_c"".""b_ptr_id"" = ""case1_b"".""a_ptr_id"")'

In [4]: str(C.objects.filter(charlie=0).query)
Out[4]: 'SELECT ""case1_a"".""id"", ""case1_a"".""alice"", ""case1_b"".""a_ptr_id"", ""case1_b"".""bob"", ""case1_c"".""b_ptr_id"", ""case1_c"".""charlie"" FROM ""case1_c"" INNER JOIN ""case1_a"" ON (""case1_c"".""b_ptr_id"" = ""case1_a"".""id"") INNER JOIN ""case1_b"" ON (""case1_c"".""b_ptr_id"" = ""case1_b"".""a_ptr_id"") WHERE ""case1_c"".""charlie"" = 0 '

In [5]: str(C.objects.filter(bob=0).query)
Out[5]: 'SELECT ""case1_a"".""id"", ""case1_a"".""alice"", ""case1_b"".""a_ptr_id"", ""case1_b"".""bob"", ""case1_c"".""b_ptr_id"", ""case1_c"".""charlie"" FROM ""case1_c"" INNER JOIN ""case1_b"" ON (""case1_c"".""b_ptr_id"" = ""case1_b"".""a_ptr_id"") INNER JOIN ""case1_a"" ON (""case1_c"".""b_ptr_id"" = ""case1_a"".""id"") WHERE ""case1_b"".""bob"" = 0 '

In [6]: str(C.objects.filter(alice=0).query)
Out[6]: 'SELECT T4.""id"", T4.""alice"", ""case1_b"".""a_ptr_id"", ""case1_b"".""bob"", ""case1_c"".""b_ptr_id"", ""case1_c"".""charlie"" FROM ""case1_c"" INNER JOIN ""case1_b"" ON (""case1_c"".""b_ptr_id"" = ""case1_b"".""a_ptr_id"") INNER JOIN ""case1_a"" ON (""case1_b"".""a_ptr_id"" = ""case1_a"".""id"") INNER JOIN ""case1_a"" T4 ON (""case1_c"".""b_ptr_id"" = T4.""id"") WHERE ""case1_a"".""alice"" = 0 '
}}}

This is with 1.3.1."	Cleanup/optimization	closed	Database layer (models, ORM)	1.3	Normal	fixed			Accepted	0	0	0	0	0	0
