#12937: Select related() not working as of Beta
---------------------------------------------------+------------------------
Reporter: subsume | Owner: nobody
Status: new | Milestone: 1.2
Component: Database layer (models, ORM) | Version: 1.2-beta
Resolution: | Keywords:
Stage: Unreviewed | Has_patch: 0
Needs_docs: 0 | Needs_tests: 0
Needs_better_patch: 0 |
---------------------------------------------------+------------------------
Changes (by ramiro):
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Old description:
> Given the following expression:
>
> {{{
> bmodels.Contact.objects.select_related('IR_contact','consumer_contact','program','consumer').filter(consumer__file=file).order_by('-
> date') }}}
>
> And the following models:
>
> {{{
>
> class Contact(models.Model):
> program = models.ForeignKey('agency.Program')
> consumer =
> models.ForeignKey('consumer.Consumer',null=True,blank=True)
> date = models.DateField('Contact Date')
> notes = models.TextField()
> date_added = models.DateTimeField(editable=False)
> method =
> models.CharField(max_length=10,choices=choices.CONTACT_METHOD,\
> null=True,blank=True)
>
> # consumer_contact
> class Contact(basemodels.Contact):
> base = models.OneToOneField(basemodels.Contact,
> parent_link=True,related_name="consumer_contact")
> service = models.ForeignKey(Service)
> confidential = models.BooleanField(default=False,help_text='These
> notes will not be visible to general staff')
> group = models.ForeignKey(Group,null=True,blank=True)
> group_contact =
> models.ForeignKey('consumer.GroupContact',blank=True,null=True)
>
> def save(self, *args, **kwargs):
> super(Contact, self).save(*args,**kwargs)
>
> class Meta:
> permissions = (
> ("allow_confidential", "Can make contacts confidential"),
> )
>
> #ir_contact
> class Contact(basemodels.Contact):
>
> base=models.OneToOneField(BaseContact,parent_link=True,related_name='IR_contact')
> IR=models.ForeignKey(IR,blank=True,null=True)
>
> referred_from=models.ForeignKey(ReferralSource,related_name='IR_referred_from')
>
> referred_to=models.ManyToManyField(ReferralSource,related_name='IR_referred_to')
>
> information=models.ManyToManyField(Information,verbose_name='Information
> Requested')
>
> }}}
>
> the following SQL is produced:
>
> {{{
>
> SELECT (fields) FROM `base_contact`
>
> LEFT OUTER JOIN `consumer_consumer` ON (`base_contact`.`consumer_id` =
> `consumer_consumer`.`id`) # ok
>
> INNER JOIN `agency_program` ON (`base_contact`.`program_id` =
> `agency_program`.`id`) # ok
>
> LEFT OUTER JOIN `consumer_contact` ON (`base_contact`.`id` =
> `consumer_contact`.`base_id`) # ok
>
> INNER JOIN `base_contact` T5 ON (`consumer_contact`.`base_id` = T5.`id`)
> # ?!?
>
> # These next two are questionable, since they are joined on a LEFT
> OUTER (so they may potentially not be there)
>
> INNER JOIN `consumer_service` ON (`consumer_contact`.`service_id` =
> `consumer_service`.`id`)
>
> INNER JOIN `consumer_servicetype` ON (`consumer_service`.`type_id` =
> `consumer_servicetype`.`id`)
>
> LEFT OUTER JOIN `IR_contact` ON (`base_contact`.`id` =
> `IR_contact`.`base_id`) # ok
>
> INNER JOIN `base_contact` T9 ON (`IR_contact`.`base_id` = T9.`id`) # ?!?
>
> WHERE `consumer_consumer`.`file` = 06-1757 ORDER BY `base_contact`.`date`
> DESC
>
> }}}
>
> As you can see, there are two INNER JOINs which are messing up this
> otherwise valid and expected query.
New description:
Given the following expression:
{{{
bmodels.Contact.objects.select_related('IR_contact','consumer_contact','program','consumer').filter(consumer__file=file).order_by('-date')
}}}
And the following models:
{{{
class Contact(models.Model):
program = models.ForeignKey('agency.Program')
consumer = models.ForeignKey('consumer.Consumer',null=True,blank=True)
date = models.DateField('Contact Date')
notes = models.TextField()
date_added = models.DateTimeField(editable=False)
method =
models.CharField(max_length=10,choices=choices.CONTACT_METHOD,\
null=True,blank=True)
# consumer_contact
class Contact(basemodels.Contact):
base = models.OneToOneField(basemodels.Contact,
parent_link=True,related_name="consumer_contact")
service = models.ForeignKey(Service)
confidential = models.BooleanField(default=False,help_text='These
notes will not be visible to general staff')
group = models.ForeignKey(Group,null=True,blank=True)
group_contact =
models.ForeignKey('consumer.GroupContact',blank=True,null=True)
def save(self, *args, **kwargs):
super(Contact, self).save(*args,**kwargs)
class Meta:
permissions = (
("allow_confidential", "Can make contacts confidential"),
)
#ir_contact
class Contact(basemodels.Contact):
base=models.OneToOneField(BaseContact,parent_link=True,related_name='IR_contact')
IR=models.ForeignKey(IR,blank=True,null=True)
referred_from=models.ForeignKey(ReferralSource,related_name='IR_referred_from')
referred_to=models.ManyToManyField(ReferralSource,related_name='IR_referred_to')
information=models.ManyToManyField(Information,verbose_name='Information
Requested')
}}}
the following SQL is produced:
{{{
SELECT (fields) FROM `base_contact`
LEFT OUTER JOIN `consumer_consumer` ON (`base_contact`.`consumer_id` =
`consumer_consumer`.`id`) # ok
INNER JOIN `agency_program` ON (`base_contact`.`program_id` =
`agency_program`.`id`) # ok
LEFT OUTER JOIN `consumer_contact` ON (`base_contact`.`id` =
`consumer_contact`.`base_id`) # ok
INNER JOIN `base_contact` T5 ON (`consumer_contact`.`base_id` = T5.`id`) #
?!?
# These next two are questionable, since they are joined on a LEFT
OUTER (so they may potentially not be there)
INNER JOIN `consumer_service` ON (`consumer_contact`.`service_id` =
`consumer_service`.`id`)
INNER JOIN `consumer_servicetype` ON (`consumer_service`.`type_id` =
`consumer_servicetype`.`id`)
LEFT OUTER JOIN `IR_contact` ON (`base_contact`.`id` =
`IR_contact`.`base_id`) # ok
INNER JOIN `base_contact` T9 ON (`IR_contact`.`base_id` = T9.`id`) # ?!?
WHERE `consumer_consumer`.`file` = 06-1757 ORDER BY `base_contact`.`date`
DESC
}}}
As you can see, there are two INNER JOINs which are messing up this
otherwise valid and expected query.
Comment:
reformatted description, please use the Preview feature.
--
Ticket URL: <http://code.djangoproject.com/ticket/12937#comment:1>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.