mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #21863 -- supplemented get_lookup() with get_transform()
Also fixed #22124 -- Expanded explanation of exactly what is going on in as_sql() methods.
This commit is contained in:
parent
a0f2525202
commit
219d928852
6 changed files with 177 additions and 41 deletions
|
@ -3,10 +3,11 @@ from __future__ import unicode_literals
|
|||
from datetime import date
|
||||
import unittest
|
||||
|
||||
from django.test import TestCase
|
||||
from .models import Author
|
||||
from django.core.exceptions import FieldError
|
||||
from django.db import models
|
||||
from django.db import connection
|
||||
from django.test import TestCase
|
||||
from .models import Author
|
||||
|
||||
|
||||
class Div3Lookup(models.Lookup):
|
||||
|
@ -289,3 +290,54 @@ class YearLteTests(TestCase):
|
|||
finally:
|
||||
YearTransform._unregister_lookup(CustomYearExact)
|
||||
YearTransform.register_lookup(YearExact)
|
||||
|
||||
|
||||
class TrackCallsYearTransform(YearTransform):
|
||||
lookup_name = 'year'
|
||||
call_order = []
|
||||
|
||||
def as_sql(self, qn, connection):
|
||||
lhs_sql, params = qn.compile(self.lhs)
|
||||
return connection.ops.date_extract_sql('year', lhs_sql), params
|
||||
|
||||
@property
|
||||
def output_type(self):
|
||||
return models.IntegerField()
|
||||
|
||||
def get_lookup(self, lookup_name):
|
||||
self.call_order.append('lookup')
|
||||
return super(TrackCallsYearTransform, self).get_lookup(lookup_name)
|
||||
|
||||
def get_transform(self, lookup_name):
|
||||
self.call_order.append('transform')
|
||||
return super(TrackCallsYearTransform, self).get_transform(lookup_name)
|
||||
|
||||
|
||||
class LookupTransformCallOrderTests(TestCase):
|
||||
def test_call_order(self):
|
||||
models.DateField.register_lookup(TrackCallsYearTransform)
|
||||
try:
|
||||
# junk lookup - tries lookup, then transform, then fails
|
||||
with self.assertRaises(FieldError):
|
||||
Author.objects.filter(birthdate__year__junk=2012)
|
||||
self.assertEqual(TrackCallsYearTransform.call_order,
|
||||
['lookup', 'transform'])
|
||||
TrackCallsYearTransform.call_order = []
|
||||
# junk transform - tries transform only, then fails
|
||||
with self.assertRaises(FieldError):
|
||||
Author.objects.filter(birthdate__year__junk__more_junk=2012)
|
||||
self.assertEqual(TrackCallsYearTransform.call_order,
|
||||
['transform'])
|
||||
TrackCallsYearTransform.call_order = []
|
||||
# Just getting the year (implied __exact) - lookup only
|
||||
Author.objects.filter(birthdate__year=2012)
|
||||
self.assertEqual(TrackCallsYearTransform.call_order,
|
||||
['lookup'])
|
||||
TrackCallsYearTransform.call_order = []
|
||||
# Just getting the year (explicit __exact) - lookup only
|
||||
Author.objects.filter(birthdate__year__exact=2012)
|
||||
self.assertEqual(TrackCallsYearTransform.call_order,
|
||||
['lookup'])
|
||||
|
||||
finally:
|
||||
models.DateField._unregister_lookup(TrackCallsYearTransform)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue