unique=True validation not working with models.CharField with choices · Issue #5004 · encode/django-rest-framework (original) (raw)

Checklist

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