Django Rest Framework "A valid integer is required." ?



我想在反序列化期间将空字符串默认为 0 或 null。

杰伦

{
  'injuries': '6',
  'children': '2',
  'civilians': '',
}

但是,我不断收到此错误:

"有效的整数是必需的。">

models.py

from django.db import models    
class Strike(models.Model):
    location = models.ForeignKey('Location', on_delete=models.CASCADE)
    civilians = models.PositiveIntegerField(blank=True, null=True)
    injuries = models.PositiveIntegerField(blank=True, null=True)
    children = models.PositiveIntegerField(blank=True, null=True)

serializers.py

from rest_framework import serializers
from .models import Strike

class StrikeSerializer(serializers.ModelSerializer):
    civilians = serializers.IntegerField(default=0, required=False)
    class Meta:
        model = Strike
        fields = '__all__'
    def create(self, validated_data):
        return Strike.objects.create(**validated_data)

主要

serializer = StrikeSerializer(data=strike)

我尝试在创建方法中操作数据,但在此之前引发了错误。我可以在 DRF 结构中的哪个位置覆盖它,特别是将 '' 转换为 0 或 None?

可以使用

CharField,然后在验证方法中转换为int

class StrikeSerializer(serializers.ModelSerializer):
    civilians = serializers.CharField(
            required=False, allow_null=True, allow_blank=True)
    def validate_civilians(self, value):
        if not value:
            return 0
        try:
            return int(value)
        except ValueError:
            raise serializers.ValidationError('You must supply an integer')

您可以使用to_internal_value方法在验证数据之前截获数据。

class StrikeSerializer(serializers.ModelSerializer):
    civilians = serializers.IntegerField(default=0, required=False)
    class Meta:
        model = Strike
        fields = '__all__'
    def to_internal_value(self, data):
        if data.get('civilians') == '':
            data['civilians'] = 0
        return super(StrikeSerializer, self).to_internal_value(data)
    def create(self, validated_data):
        return Strike.objects.create(**validated_data)

相关内容

最新更新