Changeset 7461
- Timestamp:
- 04/25/08 10:02:25 (4 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/query.py
r7451 r7461 4 4 from django.db import connection, transaction, IntegrityError 5 5 from django.db.models.fields import DateField, FieldDoesNotExist 6 from django.db.models.query_utils import Q , not_q6 from django.db.models.query_utils import Q 7 7 from django.db.models import signals, sql 8 8 from django.dispatch import dispatcher … … 356 356 set. 357 357 """ 358 return self._filter_or_exclude( None, *args, **kwargs)358 return self._filter_or_exclude(False, *args, **kwargs) 359 359 360 360 def exclude(self, *args, **kwargs): … … 363 363 set. 364 364 """ 365 return self._filter_or_exclude(not_q, *args, **kwargs) 366 367 def _filter_or_exclude(self, mapper, *args, **kwargs): 368 # mapper is a callable used to transform Q objects, 369 # or None for identity transform. 370 if mapper is None: 371 mapper = lambda x: x 365 return self._filter_or_exclude(True, *args, **kwargs) 366 367 def _filter_or_exclude(self, negate, *args, **kwargs): 372 368 if args or kwargs: 373 369 assert self.query.can_filter(), \ 374 "Cannot filter a query once a slice has been taken."370 "Cannot filter a query once a slice has been taken." 375 371 376 372 clone = self._clone() 377 if kwargs:378 clone.query.add_q( mapper(Q(**kwargs)))379 for arg in args:380 clone.query.add_q( mapper(arg))373 if negate: 374 clone.query.add_q(~Q(*args, **kwargs)) 375 else: 376 clone.query.add_q(Q(*args, **kwargs)) 381 377 return clone 382 378 django/branches/queryset-refactor/django/db/models/query_utils.py
r7245 r7461 29 29 30 30 def __init__(self, *args, **kwargs): 31 if args and kwargs: 32 raise TypeError('Use positional *or* kwargs; not both!') 33 nodes = list(args) + kwargs.items() 34 super(Q, self).__init__(children=nodes) 31 super(Q, self).__init__(children=list(args) + kwargs.items()) 35 32 36 33 def _combine(self, other, conn): … … 52 49 return obj 53 50 54 def not_q(q):55 return ~q56 django/branches/queryset-refactor/django/db/models/sql/query.py
r7459 r7461 970 970 self.promote_alias(table) 971 971 972 entry = (alias, col, field, lookup_type, value) 973 if negate and single_filter: 974 # This case is when we're doing the Q2 filter in exclude(Q1, Q2). 975 # It's different from exclude(Q1).exclude(Q2). 976 for node in self.where.children: 977 if getattr(node, 'negated', False): 978 node.add(entry, connector) 979 merged = True 980 break 981 else: 982 self.where.add(entry, connector) 983 merged = False 984 972 self.where.add((alias, col, field, lookup_type, value), connector) 985 973 if negate: 974 self.where.negate() 986 975 for alias in join_list: 987 976 self.promote_alias(alias) 988 if not merged:989 self.where.negate()990 977 if final > 1 and lookup_type != 'isnull': 991 978 for alias in join_list: … … 1020 1007 self.add_q(child) 1021 1008 self.where.end_subtree() 1009 if q_object.negated: 1010 self.where.children[-1].negate() 1022 1011 else: 1023 1012 self.add_filter(child, connector, q_object.negated,
