首页 > 解决方案 > 如何获取 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()

标签: djangodjango-rest-framework

解决方案


您只需要在字段中添加 required=False 。

默认情况下需要序列化器字段,因此您不需要为它们提供 required=True 。另一方面,对于可选字段,您需要提供 required=False。

如文档中所述:

如果在反序列化期间未提供字段,通常会引发错误。如果在反序列化期间不需要此字段,则设置为 false。

将此设置为 False 还允许在序列化实例时从输出中省略对象属性或字典键。如果密钥不存在,它将根本不包含在输出表示中。

默认为真


推荐阅读