Django REST Framework - Целочисленное поле не принимает пустой ответ?

Поле models.py IntegerField настроено:

class DMCAModel(models.Model):
    tick = models.CharField(max_length=20)
    percent_calc = models.FloatField()
    ratio = models.IntegerField(blank=True, null=True, default=None)   #The problem is here
    created_at = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, related_name='dmca',
                              on_delete=models.CASCADE, null=True)

serilaizers.py

class DMCASerializer(serializers.ModelSerializer):
    class Meta:
        model = DMCAModel
        fields = '__all__'
        # fields = ['id', 'tick', 'percent_calc', 'ratio']
# I have tried removing fields, if I remove 'ratio' then even if I send an input it is ignored.

api.py

class DmcaViewSet(viewsets.ModelViewSet):
    # queryset = DMCAModel.objects.all()
    permission_classes = [
        permissions.IsAuthenticated
    ]

    serializer_class = DcaSerializer

    def get_queryset(self):
        return self.request.user.dmca.all()

    def perform_create(self, serializer):
        # print(self.request.user)
        serializer.save(owner=self.request.user)

Когда я делаю следующий POST запрос от почтальона:

Authorization: Token xxxxxx
Body JSON:
{
"tick":"XYZ",
"percent_calc":"3",
"ratio":""
}

Я получаю ошибку:

{ "соотношение": [ "Требуется действительное целое число". ] }

Я думаю, что правильно задал свойства поля Models, если я правильно их понимаю: null=True база данных установит пустое значение NULL, blank=True будет принят ввод формы, default=None в случае, если ничего не введено. Я пытался использовать свойства по одному и посмотреть, что произойдет. Но не могу разобраться с ошибкой.

Удалите default = True. Если blank = True, то default = False, согласно документации.

Но также, null = True означает, что значение будет обязательным в формах. Поэтому удаление null = True также является частью решения.

Попробуйте это:

class DMCAModel(models.Model):
    tick = models.CharField(max_length=20)
    percent_calc = models.FloatField()
    ratio = models.IntegerField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, related_name='dmca', on_delete=models.CASCADE, null=True)

Вот полезный ответ о разнице между null и blank, также. Стоит прочитать.

Внутри вашего сериализатора вы можете использовать CharField для поля отношения, если вы хотите отправить пустую строку, а затем преобразовать ее в Int в методе валидации.

class DMCASerializer(serializers.ModelSerializer):
     ratio = serializers.CharField(required=False, allow_null=True, allow_blank=True)

     class Meta:
         model = DMCAModel
         fields = '__all__'

     def validate_ratio(self, value):
         if not value:
             return None
         try:
             return int(value)
         except ValueError:
            raise serializers.ValidationError('Valid integer is required')

Также необходимо изменить serializer_class внутри DmcaViewSet с:

serializer_class = DcaSerializer

to

serializer_class = DMCASerializer

Когда я посылаю пустую строку:

enter image description here

Когда я посылаю целое число:

enter image description here

Попробуйте передать этот запрос

Authorization: Token xxxxxx
Body JSON:
{
"tick":"XYZ",
"percent_calc":"3",
"ratio": null
}

Если вы передаете пустую строку, то в конце она будет строкой, поэтому возникнет ValidationError, также вы используете modelserializer, поэтому по умолчанию он будет проверять тип поля модели. blank=True ничего не будет значить с целым числом.

Вернуться на верх