Django

Code

Changeset 6762

Show
Ignore:
Timestamp:
11/29/07 22:44:32 (1 year ago)
Author:
mtredinnick
Message:

queryset-refactor: Implemented filtering by output columns specified in
extra(select=...). Refs #4002.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/sql/query.py

    r6760 r6762  
    693693        alias = self.join((None, opts.db_table, None, None)) 
    694694 
    695         field, target, unused, join_list, nullable = self.setup_joins(parts, 
    696                 opts, alias, (connection == AND)) 
     695        try: 
     696            field, target, unused, join_list, nullable = self.setup_joins(parts, 
     697                    opts, alias, (connection == AND)) 
     698        except TypeError, e: 
     699            if len(parts) != 1 or parts[0] not in self.extra_select: 
     700                raise e 
     701            # Filtering on some alias from extra(select=...) 
     702            self.where.add([None, parts[0], None, lookup_type, value], 
     703                    connection) 
     704            return 
    697705        col = target.column 
    698706        alias = join_list[-1][-1] 
  • django/branches/queryset-refactor/django/db/models/sql/where.py

    r6730 r6762  
    66from django.utils import tree 
    77from django.db import connection 
     8from django.db.models.fields import Field 
    89from datastructures import EmptyResultSet 
    910 
     
    9798            format = '%s %s' 
    9899 
    99         params = field.get_db_prep_lookup(lookup_type, value) 
     100        if field: 
     101            params = field.get_db_prep_lookup(lookup_type, value) 
     102        else: 
     103            params = Field().get_db_prep_lookup(lookup_type, value) 
    100104 
    101105        if lookup_type in connection.operators: 
  • django/branches/queryset-refactor/tests/regressiontests/queries/models.py

    r6730 r6762  
    405405>>> Item.objects.extra(select=SortedDict(s), params=params).values('a','b')[0] 
    406406{'a': u'one', 'b': u'two'} 
     407 
     408Bug #4002 
     409Attributes used in extra(select=...) are available for use in subsequent 
     410order_by() and filter() calls. 
     411 
     412# Order by the number of tags attached to an item. 
     413>>> l = Item.objects.extra(select={'count': 'select count(*) from queries_item_tags where queries_item_tags.item_id = queries_item.id'}).order_by('-count') 
     414>>> [o.count for o in l] 
     415[2, 2, 1, 0] 
     416 
     417# Filter those items that have exactly one tag attacjed. 
     418>>> Item.objects.extra(select={'count': 'select count(*) from queries_item_tags where queries_item_tags.item_id = queries_item.id'}).filter(count=1) 
     419[<Item: four>] 
    407420"""} 
    408421