Django

Code

Changeset 7453

Show
Ignore:
Timestamp:
04/24/08 06:41:29 (4 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Added a note about using already present tables in
extra(tables=...). This is already a problem in trunk and it's pretty much
impossible to work around in a non-complex way, so it's user beware (it's
usually easy enough to avoid the problems).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/docs/db-api.txt

    r7451 r7453  
    650650 
    651651``values_list(*fields)`` 
    652 ~~~~~~~~~~~~~~~~~~~~~~~ 
     652~~~~~~~~~~~~~~~~~~~~~~~~ 
    653653 
    654654**New in Django development version** 
     
    932932        SELECT * FROM blog_entry WHERE id IN (3, 4, 5, 20); 
    933933 
     934    Be careful when using the ``tables`` parameter if you're specifying 
     935    tables that are already used in the query. When you add extra tables 
     936    via the ``tables`` parameter, Django assumes you want that table included 
     937    an extra time, if it is already included. That creates a problem, 
     938    since the table name will then be given an alias. If a table appears 
     939    multiple times in an SQL statement, the second and subsequent occurrences 
     940    must use aliases so the database can tell them apart. If you're 
     941    referring to the extra table you added in the extra ``where`` parameter 
     942    this is going to cause errors. 
     943 
     944    Normally you'll only be adding extra tables that don't already appear in 
     945    the query. However, if the case outlined above does occur, there are a few 
     946    solutions. First, see if you can get by without including the extra table 
     947    and use the one already in the query. If that isn't possible, put your 
     948    ``extra()`` call at the front of the queryset construction so that your 
     949    table is the first use of that table. Finally, if all else fails, look at 
     950    the query produced and rewrite your ``where`` addition to use the alias 
     951    given to your extra table. The alias will be the same each time you 
     952    construct the queryset in the same way, so you can rely upon the alias 
     953    name to not change. 
     954 
    934955``order_by`` 
    935956    If you need to order the resulting queryset using some of the new fields