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 copy
import datetime import datetime
import decimal import decimal
import math
import uuid import uuid
import warnings import warnings
from base64 import b64decode, b64encode from base64 import b64decode, b64encode
@ -1875,11 +1874,6 @@ class IntegerField(Field):
return None return None
return int(value) 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): def get_internal_type(self):
return "IntegerField" return "IntegerField"

View File

@ -1,3 +1,4 @@
import math
import warnings import warnings
from copy import copy from copy import copy
@ -201,6 +202,27 @@ class LessThanOrEqual(BuiltinLookup):
Field.register_lookup(LessThanOrEqual) 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): class In(BuiltinLookup):
lookup_name = 'in' lookup_name = 'in'