Refs #22936 -- Moved IntegerField.get_prep_lookup() logic to lookups.

This commit is contained in:
Tim Graham 2016-04-12 10:14:41 -04:00
parent 461f74ab19
commit 1c30a6473d
2 changed files with 22 additions and 6 deletions

View File

@ -5,7 +5,6 @@ import collections
import copy
import datetime
import decimal
import math
import uuid
import warnings
from base64 import b64decode, b64encode
@ -1875,11 +1874,6 @@ class IntegerField(Field):
return None
return int(value)
def get_prep_lookup(self, lookup_type, value):
if lookup_type in ('gte', 'lt') and isinstance(value, float):
value = math.ceil(value)
return super(IntegerField, self).get_prep_lookup(lookup_type, value)
def get_internal_type(self):
return "IntegerField"

View File

@ -1,3 +1,4 @@
import math
import warnings
from copy import copy
@ -201,6 +202,27 @@ class LessThanOrEqual(BuiltinLookup):
Field.register_lookup(LessThanOrEqual)
class IntegerFieldFloatRounding(object):
"""
Allow floats to work as query values for IntegerField. Without this, the
decimal portion of the float would always be discarded.
"""
def get_prep_lookup(self):
if isinstance(self.rhs, float):
self.rhs = math.ceil(self.rhs)
return super(IntegerFieldFloatRounding, self).get_prep_lookup()
class IntegerGreaterThanOrEqual(IntegerFieldFloatRounding, GreaterThanOrEqual):
pass
IntegerField.register_lookup(IntegerGreaterThanOrEqual)
class IntegerLessThan(IntegerFieldFloatRounding, LessThan):
pass
IntegerField.register_lookup(IntegerLessThan)
class In(BuiltinLookup):
lookup_name = 'in'