diff options
| author | Alex Gaynor <alex.gaynor@gmail.com> | 2010-11-04 16:03:05 +0000 |
|---|---|---|
| committer | Alex Gaynor <alex.gaynor@gmail.com> | 2010-11-04 16:03:05 +0000 |
| commit | abaa3ed4bd0c010c30aa338713a56b5c2cb45cf7 (patch) | |
| tree | d4f2285468b8b30ced1ad7b3163a4097c44dc466 /django | |
| parent | 127506aeacc09f07e8e6b7c694423579f9663371 (diff) | |
Fixed #13935, added support for using QuerySet.dates across related fields. Thanks to valyagolev for his work on the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@14461 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/query.py | 10 | ||||
| -rw-r--r-- | django/db/models/sql/subqueries.py | 17 |
2 files changed, 17 insertions, 10 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py index 7e91b0fc93..bb62f22f8a 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -7,7 +7,8 @@ from itertools import izip from django.db import connections, router, transaction, IntegrityError from django.db.models.aggregates import Aggregate from django.db.models.fields import DateField -from django.db.models.query_utils import Q, select_related_descend, CollectedObjects, CyclicDependency, deferred_class_factory, InvalidQuery +from django.db.models.query_utils import (Q, select_related_descend, + CollectedObjects, CyclicDependency, deferred_class_factory, InvalidQuery) from django.db.models import signals, sql from django.utils.copycompat import deepcopy @@ -998,12 +999,7 @@ class DateQuerySet(QuerySet): self.query.clear_deferred_loading() self.query = self.query.clone(klass=sql.DateQuery, setup=True) self.query.select = [] - field = self.model._meta.get_field(self._field_name, many_to_many=False) - assert isinstance(field, DateField), "%r isn't a DateField." \ - % field.name - self.query.add_date_select(field, self._kind, self._order) - if field.null: - self.query.add_filter(('%s__isnull' % field.name, False)) + self.query.add_date_select(self._field_name, self._kind, self._order) def _clone(self, klass=None, setup=False, **kwargs): c = super(DateQuerySet, self)._clone(klass, False, **kwargs) diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py index a066dfeca8..932a4429ec 100644 --- a/django/db/models/sql/subqueries.py +++ b/django/db/models/sql/subqueries.py @@ -4,6 +4,7 @@ Query subclasses which provide extra functionality beyond simple data retrieval. from django.core.exceptions import FieldError from django.db import connections +from django.db.models.fields import DateField from django.db.models.sql.constants import * from django.db.models.sql.datastructures import Date from django.db.models.sql.expressions import SQLEvaluator @@ -184,12 +185,19 @@ class DateQuery(Query): compiler = 'SQLDateCompiler' - def add_date_select(self, field, lookup_type, order='ASC'): + def add_date_select(self, field_name, lookup_type, order='ASC'): """ Converts the query into a date extraction query. """ - result = self.setup_joins([field.name], self.get_meta(), - self.get_initial_alias(), False) + result = self.setup_joins( + field_name.split(LOOKUP_SEP), + self.get_meta(), + self.get_initial_alias(), + False + ) + field = result[0] + assert isinstance(field, DateField), "%r isn't a DateField." \ + % field.name alias = result[3][-1] select = Date((alias, field.column), lookup_type) self.select = [select] @@ -199,6 +207,9 @@ class DateQuery(Query): self.distinct = True self.order_by = order == 'ASC' and [1] or [-1] + if field.null: + self.add_filter(("%s__isnull" % field_name, False)) + class AggregateQuery(Query): """ An AggregateQuery takes another query as a parameter to the FROM |
