Django Rest Framework的奇怪行为

时间:2016-01-21 14:25:30

标签: python json django rest django-rest-framework

我有一个用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中被定义为可为空,它应该通过验证。

3 个答案:

答案 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 中使用默认选项。这种方式必须工作