我有一个用Django Rest Framework开发的API。我有一个带有一些可空字段的模型,它们是用设置
定义的required = False
序列化程序中的。当我想更新此模型的实例时,对api的PUT请求,我成功如果我将请求参数作为表单数据发送,但如果我发送带有请求有效负载的json,则API返回400错误请求,说明我的非必需参数不能为null,如:
"gender":["This field may not be null."]
当我检查请求时,具有表单数据(成功)的请求发送:
email=abc%40abc.com&first_name=John&gender=&id=13&image_url=http%3A%2F%&last_name=Doe
带有json数据的那个(失败并发生400错误)发送:
{
"id":13,
"email":"abc@abc.com",
"first_name":"John",
"last_name":"Doe",
"image_url":"http://...",
"gender":null
}
任何想法可能是什么原因?
编辑:性别的模型和序列化器字段:
在models.py中:
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True, blank=True)
在序列化程序中:
gender = serializers.CharField(required=False, source='userprofile.gender')
编辑:
来自文档:
Note: If your <field_name> is declared on your serializer with the parameter required=False then this validation step will not take place if the field is not included.
因此,如果包含此字段,将进行验证步骤,但仍然如此,因为它在db中被定义为可为空,它应该通过验证。
答案 0 :(得分:0)
将字段标记为required=False
时,表示您的请求数据可能会错过该字段和值。
您可以在请求中发送此信息:
email=abc%40abc.com&first_name=John&gender=&id=13&image_url=http%3A%2F%&last_name=Doe
因此,您要为gender
发送一个值,我猜您的问题出在您的模型中,其中gender
未标记为null=True
。如果您从请求中删除gender
,则应该有效。
email=abc%40abc.com&first_name=John&id=13&image_url=http%3A%2F%&last_name=Doe
答案 1 :(得分:0)
在Django Rest Framework中有一个序列化程序选项allow_null。我必须将它设置为True才能在序列化程序中为可空字段设置。它开始工作了。
gender = serializers.CharField(required=False, allow_null=True, source='userprofile.gender'
虽然我仍然不知道为什么需要明确设置此标志,因为该字段已在模型中定义为可为空。
答案 2 :(得分:0)
您可以在 serializers.CharField 中使用默认选项。这种方式必须工作