使用 Django rest 框架发布空日期字段错误

wgf*_*242 5 django django-rest-framework

模型.py

class Form(models.Model):
    no = models.IntegerField()
    finish_date = models.DateField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

class FormSerializer(serializers.ModelSerializer):
    class Meta:
        model = Form
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

如果我尝试:

http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
Run Code Online (Sandbox Code Playgroud)

它返回错误:

"finish_date": [
    "Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]."
]
Run Code Online (Sandbox Code Playgroud)

如果我将 "finish_date" 设置为 null ,则这篇文章有效。并且StringField(blank=True, null=True)不会得到错误。

怎么解决?

Ado*_*zis 7

问题是DateTimeField当前不支持allow_blank关键字参数。

但是它确实支持allow_null,因此您有两个选择:

  1. 发送前清理数据

发送到您的服务器之前擦洗"finish_date": ""-> "finish_date": null*

如果您使用 JavaScript 提交表单,您可能会执行以下操作:

if (data["finish_date"] == "") {
    data["finish_date"] = null;
}
Run Code Online (Sandbox Code Playgroud)
  1. 接收后清理数据

擦洗"finish_date": ""->"finish_date": None在您的序列化程序中。

您可以轻松地做到这一点使用.to_internal_value()上的方法ModelSerializer

class FormSerializer(serializers.ModelSerializer):
    class Meta:
        model = Form
        fields = '__all__'

    def to_internal_value(self, data):
        # check for "finish_date": "" and convert to None
        # This must be done before .validate()
        if data['finish_date'] == '':
            data['finish_date'] = None
        return super(FormSerializer, self).to_internal_value(data)

Run Code Online (Sandbox Code Playgroud)

.to_internal_value()方法在Django Rest Framework Fields API Reference中有很多提到


raj*_*ris 5

现在在上面的模型中,您有一个 DateField,并且 DateField 接受某些格式类似于您帖子中错误中显示的格式。当您发布时:

http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
Run Code Online (Sandbox Code Playgroud)

您实际上是将一个空字符串 ("") 传递给序列化程序,这不是 DateField 的有效格式。而是在不传递“finish_date”参数的情况下尝试发布,我认为它会起作用。或者,也许您可​​以传递过去的某个默认日期,而不是传递空字符串。