我有一个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参数,但我不确定是什么原因引起了这个问题。
谢谢!
从文档:
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魔法为你解决问题。