Как получить значение Null для проверки в поле serializers.DateTimeField ()? - PullRequest
0 голосов
/ 16 января 2020

Я использую django -rest-framework для проверки JSON, переданного на URL, который действует как webhook. Ниже я передаю 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"
        }
    }
}

Serializers.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()

1 Ответ

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

Вам просто нужно добавить в поле обязательный = False.

Поля сериализатора являются обязательными по умолчанию, поэтому вам не нужно указывать для них обязательный = True. С другой стороны, для необязательных полей необходимо указать обязательное = False.

Как указано в документации:

Обычно возникает ошибка, если поле не указывается во время десериализации. Установите значение false, если это поле не обязательно должно присутствовать во время десериализации.

Установка значения False также позволяет исключить атрибут объекта или ключ словаря из вывода при сериализации экземпляра. Если ключ отсутствует, он просто не будет включен в выходное представление.

По умолчанию True

...