[1.1.X] Fixed #10015 -- PostgreSQL 8.3+ no longer barfs when passing an integer as a filter() value for a CharField? or TextField?. Thanks, carljm

Backport of r12150 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12263 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Karen Tracey 2010-01-19 16:55:22 +00:00
parent a8e659c54f
commit 46d8ae7c24
3 changed files with 27 additions and 1 deletions

View File

@ -435,6 +435,9 @@ class CharField(Field):
ugettext_lazy("This field cannot be null.")) ugettext_lazy("This field cannot be null."))
return smart_unicode(value) return smart_unicode(value)
def get_db_prep_value(self, value):
return self.to_python(value)
def formfield(self, **kwargs): def formfield(self, **kwargs):
defaults = {'max_length': self.max_length} defaults = {'max_length': self.max_length}
defaults.update(kwargs) defaults.update(kwargs)
@ -833,6 +836,11 @@ class TextField(Field):
def get_internal_type(self): def get_internal_type(self):
return "TextField" return "TextField"
def get_db_prep_value(self, value):
if isinstance(value, basestring) or value is None:
return value
return smart_unicode(value)
def formfield(self, **kwargs): def formfield(self, **kwargs):
defaults = {'widget': forms.Textarea} defaults = {'widget': forms.Textarea}
defaults.update(kwargs) defaults.update(kwargs)

View File

@ -52,6 +52,10 @@ class BigS(models.Model):
s = models.SlugField(max_length=255) s = models.SlugField(max_length=255)
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
############################################################################### ###############################################################################
# ImageField # ImageField

View File

@ -6,7 +6,7 @@ from django import forms
from django.db import models from django.db import models
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from models import Foo, Bar, Whiz, BigD, BigS, Image from models import Foo, Bar, Whiz, BigD, BigS, Image, Post
try: try:
from decimal import Decimal from decimal import Decimal
@ -144,3 +144,17 @@ class SlugFieldTests(django.test.TestCase):
bs = BigS.objects.create(s = 'slug'*50) bs = BigS.objects.create(s = 'slug'*50)
bs = BigS.objects.get(pk=bs.pk) bs = BigS.objects.get(pk=bs.pk)
self.assertEqual(bs.s, 'slug'*50) self.assertEqual(bs.s, 'slug'*50)
class TypeCoercionTests(django.test.TestCase):
"""
Test that database lookups can accept the wrong types and convert
them with no error: especially on Postgres 8.3+ which does not do
automatic casting at the DB level. See #10015.
"""
def test_lookup_integer_in_charfield(self):
self.assertEquals(Post.objects.filter(title=9).count(), 0)
def test_lookup_integer_in_textfield(self):
self.assertEquals(Post.objects.filter(body=24).count(), 0)