mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #17728 -- When filtering an annotation, ensured the values used in the filter are properly converted to their database representation. This bug was particularly visible with timezone-aware DateTimeFields. Thanks gg for the report and Carl for the review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17576 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -6,6 +6,13 @@ class Event(models.Model):
|
||||
class MaybeEvent(models.Model):
|
||||
dt = models.DateTimeField(blank=True, null=True)
|
||||
|
||||
class Session(models.Model):
|
||||
name = models.CharField(max_length=20)
|
||||
|
||||
class SessionEvent(models.Model):
|
||||
dt = models.DateTimeField()
|
||||
session = models.ForeignKey(Session, related_name='events')
|
||||
|
||||
class Timestamp(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
updated = models.DateTimeField(auto_now=True)
|
||||
|
||||
@@ -25,7 +25,7 @@ from django.utils.tzinfo import FixedOffset
|
||||
from django.utils.unittest import skipIf, skipUnless
|
||||
|
||||
from .forms import EventForm, EventSplitForm, EventModelForm
|
||||
from .models import Event, MaybeEvent, Timestamp
|
||||
from .models import Event, MaybeEvent, Session, SessionEvent, Timestamp
|
||||
|
||||
|
||||
# These tests use the EAT (Eastern Africa Time) and ICT (Indochina Time)
|
||||
@@ -231,6 +231,28 @@ class LegacyDatabaseTests(BaseDateTimeTests):
|
||||
'dt__max': datetime.datetime(2011, 9, 1, 23, 20, 20),
|
||||
})
|
||||
|
||||
def test_query_annotation(self):
|
||||
# Only min and max make sense for datetimes.
|
||||
morning = Session.objects.create(name='morning')
|
||||
afternoon = Session.objects.create(name='afternoon')
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 23, 20, 20), session=afternoon)
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 13, 20, 30), session=afternoon)
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 3, 20, 40), session=morning)
|
||||
morning_min_dt = datetime.datetime(2011, 9, 1, 3, 20, 40)
|
||||
afternoon_min_dt = datetime.datetime(2011, 9, 1, 13, 20, 30)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).order_by('dt'),
|
||||
[morning_min_dt, afternoon_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).filter(dt__lt=afternoon_min_dt),
|
||||
[morning_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).filter(dt__gte=afternoon_min_dt),
|
||||
[afternoon_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
|
||||
def test_query_dates(self):
|
||||
Event.objects.create(dt=datetime.datetime(2011, 1, 1, 1, 30, 0))
|
||||
Event.objects.create(dt=datetime.datetime(2011, 1, 1, 4, 30, 0))
|
||||
@@ -412,6 +434,28 @@ class NewDatabaseTests(BaseDateTimeTests):
|
||||
'dt__max': datetime.datetime(2011, 9, 1, 23, 20, 20, tzinfo=EAT),
|
||||
})
|
||||
|
||||
def test_query_annotation(self):
|
||||
# Only min and max make sense for datetimes.
|
||||
morning = Session.objects.create(name='morning')
|
||||
afternoon = Session.objects.create(name='afternoon')
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 23, 20, 20, tzinfo=EAT), session=afternoon)
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 13, 20, 30, tzinfo=EAT), session=afternoon)
|
||||
SessionEvent.objects.create(dt=datetime.datetime(2011, 9, 1, 3, 20, 40, tzinfo=EAT), session=morning)
|
||||
morning_min_dt = datetime.datetime(2011, 9, 1, 3, 20, 40, tzinfo=EAT)
|
||||
afternoon_min_dt = datetime.datetime(2011, 9, 1, 13, 20, 30, tzinfo=EAT)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).order_by('dt'),
|
||||
[morning_min_dt, afternoon_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).filter(dt__lt=afternoon_min_dt),
|
||||
[morning_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
self.assertQuerysetEqual(
|
||||
Session.objects.annotate(dt=Min('events__dt')).filter(dt__gte=afternoon_min_dt),
|
||||
[afternoon_min_dt],
|
||||
transform=lambda d: d.dt)
|
||||
|
||||
def test_query_dates(self):
|
||||
# Same comment as in test_query_date_related_filters.
|
||||
Event.objects.create(dt=datetime.datetime(2011, 1, 1, 1, 30, 0, tzinfo=EAT))
|
||||
|
||||
Reference in New Issue
Block a user