mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	magic-removal: Restored and/or support for QuerySets
git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2189 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -68,7 +68,7 @@ class QuerySet(object): | |||||||
|     klass = None |     klass = None | ||||||
|  |  | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         self._filters = self.core_filters.copy() |         self._filters = Q(**(self.core_filters)) | ||||||
|         self._order_by = None        # Ordering, e.g. ('date', '-name'). If None, use model's ordering. |         self._order_by = None        # Ordering, e.g. ('date', '-name'). If None, use model's ordering. | ||||||
|         self._select_related = False # Whether to fill cache for related objects. |         self._select_related = False # Whether to fill cache for related objects. | ||||||
|         self._distinct = False       # Whether the query should use SELECT DISTINCT. |         self._distinct = False       # Whether the query should use SELECT DISTINCT. | ||||||
| @@ -104,6 +104,16 @@ class QuerySet(object): | |||||||
|         else: |         else: | ||||||
|             return self._result_cache[k] |             return self._result_cache[k] | ||||||
|  |  | ||||||
|  |     def __and__(self, other): | ||||||
|  |         combined = self._combine(other) | ||||||
|  |         combined._filters = self._filters & other._filters | ||||||
|  |         return combined | ||||||
|  |  | ||||||
|  |     def __or__(self, other): | ||||||
|  |         combined = self._combine(other) | ||||||
|  |         combined._filters = self._filters | other._filters | ||||||
|  |         return combined | ||||||
|  |  | ||||||
|     #################################### |     #################################### | ||||||
|     # METHODS THAT DO DATABASE QUERIES # |     # METHODS THAT DO DATABASE QUERIES # | ||||||
|     #################################### |     #################################### | ||||||
| @@ -245,7 +255,8 @@ class QuerySet(object): | |||||||
|     def filter(self, **kwargs): |     def filter(self, **kwargs): | ||||||
|         "Returns a new QuerySet instance with the args ANDed to the existing set." |         "Returns a new QuerySet instance with the args ANDed to the existing set." | ||||||
|         clone = self._clone() |         clone = self._clone() | ||||||
|         clone._filters.update(kwargs) |         if len(kwargs) > 0: | ||||||
|  |             clone._filters = clone._filters & Q(**kwargs) | ||||||
|         return clone |         return clone | ||||||
|  |  | ||||||
|     def select_related(self, true_or_false=True): |     def select_related(self, true_or_false=True): | ||||||
| @@ -275,7 +286,7 @@ class QuerySet(object): | |||||||
|     def _clone(self, **kwargs): |     def _clone(self, **kwargs): | ||||||
|         c = QuerySet() |         c = QuerySet() | ||||||
|         c.klass = self.klass |         c.klass = self.klass | ||||||
|         c._filters = self._filters.copy() |         c._filters = self._filters | ||||||
|         c._order_by = self._order_by |         c._order_by = self._order_by | ||||||
|         c._select_related = self._select_related |         c._select_related = self._select_related | ||||||
|         c._distinct = self._distinct |         c._distinct = self._distinct | ||||||
| @@ -288,6 +299,19 @@ class QuerySet(object): | |||||||
|         c.__dict__.update(kwargs) |         c.__dict__.update(kwargs) | ||||||
|         return c |         return c | ||||||
|  |  | ||||||
|  |     def _combine(self, other): | ||||||
|  |         if self._distinct != other._distinct: | ||||||
|  |             raise ValueException, "Can't combine a unique query with a non-unique query" | ||||||
|  |         #  use 'other's order by | ||||||
|  |         #  (so that A.filter(args1) & A.filter(args2) does the same as | ||||||
|  |         #   A.filter(args1).filter(args2) | ||||||
|  |         combined = other._clone() | ||||||
|  |         # If 'self' is ordered and 'other' isn't, propagate 'self's ordering | ||||||
|  |         if (self._order_by is not None and len(self._order_by) > 0) and \ | ||||||
|  |            (combined._order_by is None or len(combined._order_by == 0)): | ||||||
|  |             combined._order_by = self._order_by | ||||||
|  |         return combined | ||||||
|  |  | ||||||
|     def _get_data(self): |     def _get_data(self): | ||||||
|         return list(self.iterator()) |         return list(self.iterator()) | ||||||
| #         if self._result_cache is None: | #         if self._result_cache is None: | ||||||
| @@ -305,7 +329,7 @@ class QuerySet(object): | |||||||
|         params = self._params[:] |         params = self._params[:] | ||||||
|  |  | ||||||
|         # Convert self._filters into SQL. |         # Convert self._filters into SQL. | ||||||
|         tables2, joins2, where2, params2 = parse_lookup(self._filters.items(), opts) |         tables2, joins2, where2, params2 = self._filters.get_sql(opts) | ||||||
|         tables.extend(tables2) |         tables.extend(tables2) | ||||||
|         joins.update(joins2) |         joins.update(joins2) | ||||||
|         where.extend(where2) |         where.extend(where2) | ||||||
| @@ -377,32 +401,6 @@ class QuerySet(object): | |||||||
|  |  | ||||||
|         return select, " ".join(sql), params |         return select, " ".join(sql), params | ||||||
|  |  | ||||||
| # class QuerySet(object): |  | ||||||
| #     def _ensure_compatible(self, other): |  | ||||||
| #         if self._distinct != other._distinct: |  | ||||||
| #             raise ValueException, "Can't combine a unique query with a non-unique query" |  | ||||||
| # |  | ||||||
| #     def _combine(self, other): |  | ||||||
| #         self._ensure_compatible(other) |  | ||||||
| #         # get a deepcopy of 'other's order by |  | ||||||
| #         #  (so that A.filter(args1) & A.filter(args2) does the same as |  | ||||||
| #         #   A.filter(args1).filter(args2) |  | ||||||
| #         combined = other._clone() |  | ||||||
| #         # If 'self' is ordered and 'other' isn't, propagate 'self's ordering |  | ||||||
| #         if len(self._order_by) > 0 and len(combined._order_by == 0): |  | ||||||
| #             combined._order_by = copy.deepcopy(self._order_by) |  | ||||||
| #         return combined |  | ||||||
| # |  | ||||||
| #     def __and__(self, other): |  | ||||||
| #         combined = self._combine(other) |  | ||||||
| #         combined._filter = self._filter & other._filter |  | ||||||
| #         return combined |  | ||||||
| # |  | ||||||
| #     def __or__(self, other): |  | ||||||
| #         combined = self._combine(other) |  | ||||||
| #         combined._filter = self._filter | other._filter |  | ||||||
| #         return combined |  | ||||||
|  |  | ||||||
| class QOperator: | class QOperator: | ||||||
|     "Base class for QAnd and QOr" |     "Base class for QAnd and QOr" | ||||||
|     def __init__(self, *args): |     def __init__(self, *args): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user