Django поле даты и времени оставшейся рамки не будет проверять пустую строку - PullRequest
1 голос
/ 17 января 2020

Я разработал веб-хук для приема транзакций из моего банка. Я использую Django -rest-framework для проверки данных перед их сохранением в моей базе данных. Тем не менее, мой банк передает пустую строку для поля «улажено», и Django -rest-framework, похоже, не может проверить форму с пустыми значениями в поле datetime. 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()

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Вам необходимо переопределить to_internal_value:

class DataSerializer(serializers.Serializer):
    def to_internal_value(self, data):
        if data.get('settled') == '':
            data['settled'] = None
        return super().get_internal_value(data)
0 голосов
/ 17 января 2020

Я думаю, что это будет сделано, попробовав это settled = serializers.DateTimeField(required=False, allow_null=True , blank = True)

...