Django Rest Framework序列化程序`source`给出了奇怪的必需错误

问题描述 投票:3回答:1

我有一个API,它向我发送字段名称与我的模型中的字段名称不匹配(并且我无法控制),并且我尝试将它们映射到序列化程序中,但出于某种原因我实际实现了这个:

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(source='customer_email')
    first_name = serializers.CharField(source='first name')
    last_name = serializers.CharField(source='last name')
    address = serializers.CharField(source='customer_address')
    phone = serializers.CharField(source='customer_phone')
    messenger_id = serializers.IntegerField(source='messenger user id')

    class Meta:
        model = User
        fields = ('id', 'url', 'email', 'first_name', 'last_name', 'address', 'phone', 'messenger_id',)

我收到以下错误:

{
    "phone": [
        "This field is required."
    ],
    "first_name": [
        "This field is required."
    ],
    "last_name": [
        "This field is required."
    ],
    "messenger_id": [
        "This field is required."
    ],
    "email": [
        "This field is required."
    ],
    "address": [
        "This field is required."
    ]
}

但是,在这些领域中,我的模型中实际需要的唯一一个是email字段。我根据最高评级答案source=使用了here参数,但我不确定是什么原因引起了这个问题。

谢谢!

python django django-rest-framework
1个回答
0
投票

从文档:

required - 如果在反序列化期间未提供字段,通常会引发错误。如果在反序列化期间不需要此字段,则设置为false。

将此设置为False还允许在序列化实例时从输出中省略对象属性或字典键。如果密钥不存在,它将不会包含在输出表示中。

默认为True。

简而言之,通过“手动”定义序列化程序字段而不使用自动创建,可以在拉出的“必需”字段上运行 - 并将其默认设置为true。像这样改变你的代码:

email = serializers.EmailField(source='customer_email')
first_name = serializers.CharField(source='first name',required = False)
last_name = serializers.CharField(source='last name',required = False)
address = serializers.CharField(source='customer_address',required = False)
phone = serializers.CharField(source='customer_phone',required = False)
messenger_id = serializers.IntegerField(source='messenger user id',required = False)

而且,似乎你在某些地方错过了下划线。 +我建议您只使用fields =('all')或者如果要排除某些字段 - > exclude =(''#enter excluded names here)。所以要包括:

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(source='customer_email',required = False)
    first_name = serializers.CharField(source='first_name',required = False)
    last_name = serializers.CharField(source='last_name',required = False)
    address = serializers.CharField(source='customer_address',required = False)
    phone = serializers.CharField(source='customer_phone',required = False)
    messenger_id = serializers.IntegerField(source='messenger_user_id',required = False)

    class Meta:
        model = User
        exclude = () # insert excluded files here

为了完成,我建议您在创建序列化程序类时检查是否确实要显式声明所有字段。大多数情况下你可以避免这种情况,让Django-rest-framework魔法为你解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.