From 8badb7587666127bf646a065ff58d84ed813c3ca Mon Sep 17 00:00:00 2001 From: Karen Tracey Date: Sat, 20 Mar 2010 18:04:10 +0000 Subject: [PATCH] [1.1.X] Fixed #12239: Fixed results of gte and lt queries when comparing floats to integer field values. Thanks waverider, aroy, SmileyChris, and pmclanahan. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12820 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/__init__.py | 6 ++++ tests/regressiontests/queries/models.py | 39 +++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 769ab83cd4..e4e4f6cf24 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -2,6 +2,7 @@ import datetime import os import re import time +import math import django.utils.copycompat as copy @@ -722,6 +723,11 @@ class IntegerField(Field): return None return int(value) + def get_db_prep_lookup(self, lookup_type, value): + if lookup_type == 'gte' or lookup_type == 'lt': + value = math.ceil(value) + return super(IntegerField, self).get_db_prep_lookup(lookup_type, value) + def get_internal_type(self): return "IntegerField" diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index ddac509ede..f01e5f2c3e 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -417,6 +417,45 @@ constraints. >>> Number.objects.filter(Q(num__gt=7) & Q(num__lt=12) | Q(num__lt=4)) [] +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.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.objects.filter(num__lt=12.0) +[, ] +>>> Number.objects.filter(num__lt=12.1) +[, , ] +>>> Number.objects.filter(num__gte=11.9) +[] +>>> Number.objects.filter(num__gte=12) +[] +>>> Number.objects.filter(num__gte=12.0) +[] +>>> Number.objects.filter(num__gte=12.1) +[] +>>> Number.objects.filter(num__gte=12.9) +[] +>>> Number.objects.filter(num__lte=11.9) +[, ] +>>> Number.objects.filter(num__lte=12) +[, , ] +>>> Number.objects.filter(num__lte=12.0) +[, , ] +>>> Number.objects.filter(num__lte=12.1) +[, , ] +>>> Number.objects.filter(num__lte=12.9) +[, , ] + Bug #7872 Another variation on the disjunctive filtering theme.