django - 如何获取 Null 值以在 serializers.DateTimeField() 字段中进行验证?
问题描述
我正在使用 django-rest-framework 来验证传递给充当 webhook 的 URL 的 JSON。下面是我传递的 JSON 和用于验证数据的序列化程序。有什么方法可以让 serializers.DateTimeField() 字段允许空值?我已经在下面标记了相关字段...
JSON 传递给 webhook:
{
"type": "transaction.created",
"data": {
"account_id": "acc_00008gju41AHyfLUzBUk8A",
"amount": -350,
"created": "2015-09-04T14:28:40Z",
"currency": "GBP",
"description": "Ozone Coffee Roasters",
"id": "tx_00008zjky19HyFLAzlUk7t",
"category": "eating_out",
"is_load": false,
"settled": null, <-- this field is sometimes null
"merchant": {
"address": {
"address": "98 Southgate Road",
"city": "London",
"country": "GB",
"latitude": 51.54151,
"longitude": -0.08482400000002599,
"postcode": "N1 3JD",
"region": "Greater London"
},
"created": "2015-08-22T12:20:18Z",
"group_id": "grp_00008zIcpbBOaAr7TTP3sv",
"id": "merch_00008zIcpbAKe8shBxXUtl",
"logo": "https://pbs.twimg.com/profile_images/527043602623389696/68_SgUWJ.jpeg",
"emoji": "",
"name": "The De Beauvoir Deli Co.",
"category": "eating_out"
}
}
}
序列化器.py:
class MerchantSerializer(serializers.Serializer):
id = serializers.CharField(required=True, max_length=50)
name = serializers.CharField(required=True, max_length=100)
logo = serializers.URLField(max_length=250, required=False)
class DataSerializer(serializers.Serializer):
account_id = serializers.CharField(required=True, max_length=50)
amount = serializers.IntegerField(required=True)
created = serializers.DateTimeField()
currency = serializers.CharField(required=True, max_length=3)
description = serializers.CharField(required=True, max_length=250)
id = serializers.CharField(required=True, max_length=50)
category = serializers.CharField(required=True, max_length=100)
is_load = serializers.BooleanField()
settled = serializers.DateTimeField(required=False) # <-- fails validation here
merchant = MerchantSerializer()
class TransactionSerializer(serializers.Serializer):
type = serializers.CharField(required=True, max_length=50)
data = DataSerializer()
解决方案
您只需要在字段中添加 required=False 。
默认情况下需要序列化器字段,因此您不需要为它们提供 required=True 。另一方面,对于可选字段,您需要提供 required=False。
如文档中所述:
如果在反序列化期间未提供字段,通常会引发错误。如果在反序列化期间不需要此字段,则设置为 false。
将此设置为 False 还允许在序列化实例时从输出中省略对象属性或字典键。如果密钥不存在,它将根本不包含在输出表示中。
默认为真