Decimal value allowed for auto primary key

39 views
Skip to first unread message

Kafex

unread,
Oct 25, 2014, 8:37:55 PM10/25/14
to django...@googlegroups.com
If I have the following model...
class FruitType(models.Model):
  name
= models.CharField(max_length=255)

And I insert some records...
FruitType.objects.create(name="Apple")
FruitType.objects.create(name="Orange")

Why is this valid?
FruitType.objects.get(id=1.2) # Gets me the apple
FruitType.objects.get(id=2.9) # Gets me the apple


Django seems to truncate the id to just the integer part.
This also applies to form validation:
class FruitForm(forms.Form):
  type
= forms.ModelChoiceField(queryset=FruitType.objects.all())

form = FruitForm(data={'type': 1.5})
form
.is_valid() # returns True

Is there any way to prevent this? I.e., I want my form to treat 1.5 as invalid input and raise a ValidationError.

Thank you.


Kafex

unread,
Oct 25, 2014, 8:47:49 PM10/25/14
to django...@googlegroups.com
Whoops... just to clarify...

FruitType.objects.get(id=2.9) # Gets me the apple

I meant to comment that this gets me the orange.

Tom Evans

unread,
Oct 26, 2014, 7:34:06 PM10/26/14
to django...@googlegroups.com
On Sun, Oct 26, 2014 at 12:37 AM, Kafex <kaf...@gmail.com> wrote:
> If I have the following model...
> class FruitType(models.Model):
> name = models.CharField(max_length=255)
>
> And I insert some records...
> FruitType.objects.create(name="Apple")
> FruitType.objects.create(name="Orange")
>
> Why is this valid?
> FruitType.objects.get(id=1.2) # Gets me the apple
> FruitType.objects.get(id=2.9) # Gets me the apple
>
>
> Django seems to truncate the id to just the integer part.

Yes. The value is coerced to int, that is int(value) will be run on
it. If you pass a type that can be coerced to an int, no error will be
raised, so be aware of that.

> This also applies to form validation:
> class FruitForm(forms.Form):
> type = forms.ModelChoiceField(queryset=FruitType.objects.all())
>
> form = FruitForm(data={'type': 1.5})
> form.is_valid() # returns True
>
> Is there any way to prevent this? I.e., I want my form to treat 1.5 as
> invalid input and raise a ValidationError.

This one is less obviously a problem, a typical form would actually be
passed the string '1.5' (not the float 1.5), which would in fact raise
a ValidationError.

Cheers

Tom

Kafex

unread,
Oct 26, 2014, 8:51:14 PM10/26/14
to django...@googlegroups.com
Ok, that makes sense, thanks for the reply!
Reply all
Reply to author
Forward
0 new messages