Fixed #7105 -- Fixed dates() queries in light of model inheritance.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7763 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-06-26 07:51:19 +00:00
parent d2ce1df08f
commit 279fc8599b
3 changed files with 24 additions and 8 deletions

View File

@ -688,7 +688,7 @@ class DateQuerySet(QuerySet):
""" """
self.query = self.query.clone(klass=sql.DateQuery, setup=True) self.query = self.query.clone(klass=sql.DateQuery, setup=True)
self.query.select = [] self.query.select = []
self.query.add_date_select(self._field.column, self._kind, self._order) self.query.add_date_select(self._field, self._kind, self._order)
if self._field.null: if self._field.null:
self.query.add_filter(('%s__isnull' % self._field.name, False)) self.query.add_filter(('%s__isnull' % self._field.name, False))

View File

@ -357,12 +357,14 @@ class DateQuery(Query):
date = typecast_timestamp(str(date)) date = typecast_timestamp(str(date))
yield date yield date
def add_date_select(self, column, lookup_type, order='ASC'): def add_date_select(self, field, lookup_type, order='ASC'):
""" """
Converts the query into a date extraction query. Converts the query into a date extraction query.
""" """
alias = self.join((None, self.model._meta.db_table, None, None)) result = self.setup_joins([field.name], self.get_meta(),
select = Date((alias, column), lookup_type, self.get_initial_alias(), False)
alias = result[3][-1]
select = Date((alias, field.column), lookup_type,
self.connection.ops.date_trunc_sql) self.connection.ops.date_trunc_sql)
self.select = [select] self.select = [select]
self.select_fields = [None] self.select_fields = [None]

View File

@ -2,6 +2,8 @@
Regression tests for Model inheritance behaviour. Regression tests for Model inheritance behaviour.
""" """
import datetime
from django.db import models from django.db import models
class Place(models.Model): class Place(models.Model):
@ -10,7 +12,7 @@ class Place(models.Model):
class Meta: class Meta:
ordering = ('name',) ordering = ('name',)
def __unicode__(self): def __unicode__(self):
return u"%s the place" % self.name return u"%s the place" % self.name
@ -35,11 +37,17 @@ class ParkingLot(Place):
def __unicode__(self): def __unicode__(self):
return u"%s the parking lot" % self.name return u"%s the parking lot" % self.name
class Parent(models.Model):
created = models.DateTimeField(default=datetime.datetime.now)
class Child(Parent):
name = models.CharField(max_length=10)
__test__ = {'API_TESTS':""" __test__ = {'API_TESTS':"""
# Regression for #7350, #7202 # Regression for #7350, #7202
# Check that when you create a Parent object with a specific reference to an existent # Check that when you create a Parent object with a specific reference to an
# child instance, saving the Parent doesn't duplicate the child. # existent child instance, saving the Parent doesn't duplicate the child. This
# This behaviour is only activated during a raw save - it is mostly relevant to # behaviour is only activated during a raw save - it is mostly relevant to
# deserialization, but any sort of CORBA style 'narrow()' API would require a # deserialization, but any sort of CORBA style 'narrow()' API would require a
# similar approach. # similar approach.
@ -117,4 +125,10 @@ __test__ = {'API_TESTS':"""
>>> [sorted(d.items()) for d in dicts] >>> [sorted(d.items()) for d in dicts]
[[('name', u"Guido's All New House of Pasta"), ('serves_gnocchi', False), ('serves_hot_dogs', False)]] [[('name', u"Guido's All New House of Pasta"), ('serves_gnocchi', False), ('serves_hot_dogs', False)]]
# Regressions tests for #7105: dates() queries should be able to use fields
# from the parent model as easily as the child.
>>> obj = Child.objects.create(name='child', created=datetime.datetime(2008, 6, 26, 17, 0, 0))
>>> Child.objects.dates('created', 'month')
[datetime.datetime(2008, 6, 1, 0, 0)]
"""} """}