Skip to content

Commit

Permalink
Fixed #12239: Fixed results of gte and lt queries when comparing floa…
Browse files Browse the repository at this point in the history
…ts to integer field values.

Thanks waverider, aroy, SmileyChris, and pmclanahan.



git-svn-id: http://code.djangoproject.com/svn/django/trunk@12819 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
kmtracey committed Mar 20, 2010
1 parent 3a5dae5 commit 9150fb6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
6 changes: 6 additions & 0 deletions django/db/models/fields/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import decimal
import re
import time
import math

import django.utils.copycompat as copy

Expand Down Expand Up @@ -882,6 +883,11 @@ def get_prep_value(self, value):
return None
return int(value)

def get_prep_lookup(self, lookup_type, value):
if lookup_type == 'gte' or lookup_type == 'lt':
value = math.ceil(value)
return super(IntegerField, self).get_prep_lookup(lookup_type, value)

def get_internal_type(self):
return "IntegerField"

Expand Down
39 changes: 39 additions & 0 deletions tests/regressiontests/queries/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,45 @@ def __unicode__(self):
>>> Number.objects.filter(Q(num__gt=7) & Q(num__lt=12) | Q(num__lt=4))
[<Number: 8>]
Bug #12239
Float was being rounded to integer on gte queries on integer field. Tests
show that gt, lt, gte, and lte work as desired. Note that the fix changes
get_prep_lookup for gte and lt queries only.
>>> Number.objects.filter(num__gt=11.9)
[<Number: 12>]
>>> Number.objects.filter(num__gt=12)
[]
>>> Number.objects.filter(num__gt=12.0)
[]
>>> Number.objects.filter(num__gt=12.1)
[]
>>> Number.objects.filter(num__lt=12)
[<Number: 4>, <Number: 8>]
>>> Number.objects.filter(num__lt=12.0)
[<Number: 4>, <Number: 8>]
>>> Number.objects.filter(num__lt=12.1)
[<Number: 4>, <Number: 8>, <Number: 12>]
>>> Number.objects.filter(num__gte=11.9)
[<Number: 12>]
>>> Number.objects.filter(num__gte=12)
[<Number: 12>]
>>> Number.objects.filter(num__gte=12.0)
[<Number: 12>]
>>> Number.objects.filter(num__gte=12.1)
[]
>>> Number.objects.filter(num__gte=12.9)
[]
>>> Number.objects.filter(num__lte=11.9)
[<Number: 4>, <Number: 8>]
>>> Number.objects.filter(num__lte=12)
[<Number: 4>, <Number: 8>, <Number: 12>]
>>> Number.objects.filter(num__lte=12.0)
[<Number: 4>, <Number: 8>, <Number: 12>]
>>> Number.objects.filter(num__lte=12.1)
[<Number: 4>, <Number: 8>, <Number: 12>]
>>> Number.objects.filter(num__lte=12.9)
[<Number: 4>, <Number: 8>, <Number: 12>]
Bug #7872
Another variation on the disjunctive filtering theme.
Expand Down

0 comments on commit 9150fb6

Please sign in to comment.