【问题标题】:Django rest framework datetimefield won't validate empty stringDjango 休息框架日期时间字段不会验证空字符串
【发布时间】:2020-01-16 22:30:21
【问题描述】:

我开发了一个网络挂钩来接收来自我的银行的交易。在将数据保存到我的数据库之前,我使用 Django-rest-framework 来验证数据。但是,我的银行为“已解决”字段传递了一个空白字符串,而 Django-rest-framework 似乎无法验证日期时间字段中具有空白值的表单。 null 可以,但空字符串不行。怎么办?

我的银行传递的 JSON:

{
    "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": "",
        "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"
        }
    }
}
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, allow_null=True)
    merchant = MerchantSerializer()

class TransactionSerializer(serializers.Serializer):
    type = serializers.CharField(required=True, max_length=50)
    data = DataSerializer()

【问题讨论】:

  • 试试 allow_blank=True
  • allow_blank 不是日期时间字段的有效关键字参数

标签: django django-rest-framework


【解决方案1】:

我认为可以通过尝试这个来完成 settled = serializers.DateTimeField(required=False, allow_null=True , blank = True)

【讨论】:

【解决方案2】:

你需要覆盖to_internal_value:

class DataSerializer(serializers.Serializer):
    def to_internal_value(self, data):
        if data.get('settled') == '':
            data['settled'] = None
        return super().to_internal_value(data)

【讨论】:

  • 嗨,我试过了,但我得到:AttributeError: 'super' object has no attribute 'get_internal_value'
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2016-12-09
  • 2018-02-24
  • 2015-01-15
  • 2021-05-19
  • 2014-05-31
相关资源
最近更新 更多