unique=True validation not working with models.CharField with choices · Issue #5004 · encode/django-rest-framework (original) (raw)
Checklist
- I have verified that that issue exists against the
master
branch of Django REST framework. - I have searched for similar issues in both open and closed tickets and cannot find a duplicate.
- This is not a usage question. (Those should be directed to the discussion group instead.)
- This cannot be dealt with as a third party library. (We prefer new functionality to be in the form of third party libraries where possible.)
- I have reduced the issue to the simplest possible case.
- I have included a failing test as a pull request. (If you are unable to do so we can still accept the issue.)
Steps to reproduce
Lets take a model
MY_CHOICES = ( ('choice1', _('choice 1')), ('choice2', _('choice 1')), )
class Poll(models.Model): form_name = models.CharField('name', max_length=254, unique=True, choices=MY_CHOICES)
class PollSerializer(serializers.ModelSerializer): class Meta: model = Poll fields = 'all'
class PollCreateView(generics.CreateAPIView): serializer_class = PollSerializer
Then making a POST request with {"form_name": "choice1"}
first time returns { "id": 1, "form_name": "choice1" }
then by making same request again with data {"form_name": "choice1"}
instead of giving valid error response, django's IntegrityError exception is thrown.
This behaviour is only coming if models.CharField is used with choices and unique=True and not when models.CharField is used without choices
Expected behavior
Valid error response should be returned instead of throwing django's IntegrityError exception
like { "form_name": [ "poll with this name already exists." ] }
Actual behavior
Throwing django's IntegrityError exception when models.CharField is used with choices and unique=True