mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-04-28 04:53:43 +03:00
Fix for #446. Note: Also needs applying to other relational types.
This commit is contained in:
parent
9b1532b1ea
commit
6e9865cb71
|
@ -4,6 +4,7 @@ from django import forms
|
||||||
from django.forms import widgets
|
from django.forms import widgets
|
||||||
from django.forms.models import ModelChoiceIterator
|
from django.forms.models import ModelChoiceIterator
|
||||||
from django.utils.encoding import smart_unicode
|
from django.utils.encoding import smart_unicode
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from rest_framework.fields import Field, WritableField
|
from rest_framework.fields import Field, WritableField
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
@ -168,6 +169,11 @@ class PrimaryKeyRelatedField(RelatedField):
|
||||||
default_read_only = False
|
default_read_only = False
|
||||||
form_field_class = forms.ChoiceField
|
form_field_class = forms.ChoiceField
|
||||||
|
|
||||||
|
default_error_messages = {
|
||||||
|
'does_not_exist': _("Invalid pk '%s' - object does not exist."),
|
||||||
|
'invalid': _('Invalid value.'),
|
||||||
|
}
|
||||||
|
|
||||||
# TODO: Remove these field hacks...
|
# TODO: Remove these field hacks...
|
||||||
def prepare_value(self, obj):
|
def prepare_value(self, obj):
|
||||||
return self.to_native(obj.pk)
|
return self.to_native(obj.pk)
|
||||||
|
@ -193,7 +199,10 @@ class PrimaryKeyRelatedField(RelatedField):
|
||||||
try:
|
try:
|
||||||
return self.queryset.get(pk=data)
|
return self.queryset.get(pk=data)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
msg = "Invalid pk '%s' - object does not exist." % smart_unicode(data)
|
msg = self.error_messages['does_not_exist'] % smart_unicode(data)
|
||||||
|
raise ValidationError(msg)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
msg = self.error_messages['invalid']
|
||||||
raise ValidationError(msg)
|
raise ValidationError(msg)
|
||||||
|
|
||||||
def field_to_native(self, obj, field_name):
|
def field_to_native(self, obj, field_name):
|
||||||
|
@ -215,6 +224,11 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
|
||||||
default_read_only = False
|
default_read_only = False
|
||||||
form_field_class = forms.MultipleChoiceField
|
form_field_class = forms.MultipleChoiceField
|
||||||
|
|
||||||
|
default_error_messages = {
|
||||||
|
'does_not_exist': _("Invalid pk '%s' - object does not exist."),
|
||||||
|
'invalid': _('Invalid value.'),
|
||||||
|
}
|
||||||
|
|
||||||
def prepare_value(self, obj):
|
def prepare_value(self, obj):
|
||||||
return self.to_native(obj.pk)
|
return self.to_native(obj.pk)
|
||||||
|
|
||||||
|
@ -249,7 +263,10 @@ class ManyPrimaryKeyRelatedField(ManyRelatedField):
|
||||||
try:
|
try:
|
||||||
return self.queryset.get(pk=data)
|
return self.queryset.get(pk=data)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
msg = "Invalid pk '%s' - object does not exist." % smart_unicode(data)
|
msg = self.error_messages['does_not_exist'] % smart_unicode(data)
|
||||||
|
raise ValidationError(msg)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
msg = self.error_messages['invalid']
|
||||||
raise ValidationError(msg)
|
raise ValidationError(msg)
|
||||||
|
|
||||||
### Slug relationships
|
### Slug relationships
|
||||||
|
|
18
rest_framework/tests/fields.py
Normal file
18
rest_framework/tests/fields.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.test import TestCase
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
||||||
|
class NullModel(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class FieldTests(TestCase):
|
||||||
|
def test_pk_related_field_with_empty_string(self):
|
||||||
|
"""
|
||||||
|
Regression test for #446
|
||||||
|
|
||||||
|
https://github.com/tomchristie/django-rest-framework/issues/446
|
||||||
|
"""
|
||||||
|
field = serializers.PrimaryKeyRelatedField(queryset=NullModel.objects.all())
|
||||||
|
self.assertRaises(serializers.ValidationError, field.from_native, ('',))
|
Loading…
Reference in New Issue
Block a user