Fixed #9390 -- Restored some documentation about select_related() that was
accidentally lost in the docs refactor. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9256 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
92a6c14291
commit
9900c87161
|
@ -511,8 +511,8 @@ related ``Person`` *and* the related ``City``::
|
||||||
p = b.author # Hits the database.
|
p = b.author # Hits the database.
|
||||||
c = p.hometown # Hits the database.
|
c = p.hometown # Hits the database.
|
||||||
|
|
||||||
Note that ``select_related()`` does not follow foreign keys that have
|
Note that, by default, ``select_related()`` does not follow foreign keys that
|
||||||
``null=True``.
|
have ``null=True``.
|
||||||
|
|
||||||
Usually, using ``select_related()`` can vastly improve performance because your
|
Usually, using ``select_related()`` can vastly improve performance because your
|
||||||
app can avoid many database calls. However, in situations with deeply nested
|
app can avoid many database calls. However, in situations with deeply nested
|
||||||
|
@ -527,9 +527,44 @@ follow::
|
||||||
p = b.author # Doesn't hit the database.
|
p = b.author # Doesn't hit the database.
|
||||||
c = p.hometown # Requires a database call.
|
c = p.hometown # Requires a database call.
|
||||||
|
|
||||||
|
Sometimes you only want to access specific models that are related to your root
|
||||||
|
model, not all of the related models. In these cases, you can pass the related
|
||||||
|
field names to ``select_related()`` and it will only follow those relations.
|
||||||
|
You can even do this for models that are more than one relation away by
|
||||||
|
separating the field names with double underscores, just as for filters. For
|
||||||
|
example, if you have this model::
|
||||||
|
|
||||||
|
class Room(models.Model):
|
||||||
|
# ...
|
||||||
|
building = models.ForeignKey(...)
|
||||||
|
|
||||||
|
class Group(models.Model):
|
||||||
|
# ...
|
||||||
|
teacher = models.ForeignKey(...)
|
||||||
|
room = models.ForeignKey(Room)
|
||||||
|
subject = models.ForeignKey(...)
|
||||||
|
|
||||||
|
...and you only needed to work with the ``room`` and ``subject`` attributes,
|
||||||
|
you could write this::
|
||||||
|
|
||||||
|
g = Group.objects.select_related('room', 'subject')
|
||||||
|
|
||||||
|
This is also valid::
|
||||||
|
|
||||||
|
g = Group.objects.select_related('room__building', 'subject')
|
||||||
|
|
||||||
|
...and would also pull in the ``building`` relation.
|
||||||
|
|
||||||
|
You can only refer to ``ForeignKey`` relations in the list of fields passed to
|
||||||
|
``select_related``. You *can* refer to foreign keys that have ``null=True``
|
||||||
|
(unlike the default ``select_related()`` call). It's an error to use both a
|
||||||
|
list of fields and the ``depth`` parameter in the same ``select_related()``
|
||||||
|
call, since they are conflicting options.
|
||||||
|
|
||||||
.. versionadded:: 1.0
|
.. versionadded:: 1.0
|
||||||
|
|
||||||
The ``depth`` argument is new in Django version 1.0.
|
Both the ``depth`` argument and the ability to specify field names in the call
|
||||||
|
to ``select_related()`` are new in Django version 1.0.
|
||||||
|
|
||||||
``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)``
|
``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
Loading…
Reference in New Issue