#10722: Changelist view does not use select_related() on a nullable foreign key
---------------------------+------------------------------------------------
 Reporter:  mrts           |       Owner:  nobody    
   Status:  new            |   Milestone:            
Component:  Uncategorized  |     Version:  SVN       
 Keywords:                 |       Stage:  Unreviewed
Has_patch:  0              |  
---------------------------+------------------------------------------------
 Given the following `models.py`:

 {{{
 from django.db import models

 class Base(models.Model):
     name = models.CharField(max_length=10)
     lots_of_text = models.TextField()

     class Meta:
         abstract = True

     def __unicode__(self):
         return self.name

 class A(Base):
     a_field = models.CharField(max_length=10)

 class B(Base):
     b_field = models.CharField(max_length=10)

 class C(Base):
     a = models.ForeignKey(A)
     b = models.ForeignKey(B)
     is_published = models.BooleanField()
 }}}

 and the following `admin.py`:

 {{{
 from django.contrib import admin
 from improve_admin.models import A, B, C

 class CAdmin(admin.ModelAdmin):
     list_display = ('name', 'a', 'b', 'is_published')

 admin.site.register(A)
 admin.site.register(B)
 admin.site.register(C, CAdmin)
 }}}

 `select_related()` is used as documented in
 http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-select-
 related , resulting in the following query:

 {{{
 SELECT
         "improve_admin_c"."id", "improve_admin_c"."name",
 "improve_admin_c"."lots_of_text", "improve_admin_c"."a_id",
 "improve_admin_c"."b_id", "improve_admin_c"."is_published",
 "improve_admin_a"."id", "improve_admin_a"."name",
 "improve_admin_a"."lots_of_text", "improve_admin_a"."a_field",
 "improve_admin_b"."id", "improve_admin_b"."name",
 "improve_admin_b"."lots_of_text", "improve_admin_b"."b_field"
 FROM
         "improve_admin_c"
         INNER JOIN "improve_admin_a" ON ("improve_admin_c"."a_id" =
 "improve_admin_a"."id")
         INNER JOIN "improve_admin_b" ON ("improve_admin_c"."b_id" =
 "improve_admin_b"."id")
 ORDER BY
         "improve_admin_c"."id" DESC
 }}}

 ----

 Setting one foreign key field to be nullable:
 {{{
 # diff between the original and new models.py
  class C(Base):
 -    a = models.ForeignKey(A)
 +    a = models.ForeignKey(A, blank=True, null=True)
      b = models.ForeignKey(B)
 }}}

 results in the following SQL:
 {{{
 SELECT
         "improve_admin_c"."id", "improve_admin_c"."name",
 "improve_admin_c"."lots_of_text", "improve_admin_c"."a_id",
 "improve_admin_c"."b_id", "improve_admin_c"."is_published",
 "improve_admin_b"."id", "improve_admin_b"."name",
 "improve_admin_b"."lots_of_text", "improve_admin_b"."b_field"
 FROM
         "improve_admin_c"
         INNER JOIN "improve_admin_b" ON ("improve_admin_c"."b_id" =
 "improve_admin_b"."id")
 ORDER BY
         "improve_admin_c"."id" DESC
 }}}

 and additional `n` queries for each of the referred `a` fields:

 {{{
 SELECT
         "improve_admin_a"."id", "improve_admin_a"."name",
 "improve_admin_a"."lots_of_text", "improve_admin_a"."a_field"
 FROM
         "improve_admin_a"
 WHERE
         "improve_admin_a"."id" = 2
 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/10722>
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to