Как правильно настроить проверку данных? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть класс DRF, который получает дату JSON и после его обработки создает новые экземпляры базы данных.

class CsvToDatabase(APIView):

    def post(self, request, format=None):
        data = request.data
        print()
        for _, vendor in data.items():
            v = Vendors(
                vendor_name=vendor['Vendor'],
                country=vendor['Country'],
                nda=vendor['NDA date'],

            )
            try:
                v.full_clean()
            except ValidationError as e:
                data = ({'status': str(e)})
                return Response(data, content_type='application/json')
            v.save()
        return Response({'received data': request.data,
                         'message': 'Vendors from vendors_list were successfully added to the database'})

models.py

class Vendors(models.Model):
    COUNTRY_CHOICES = tuple(countries)

    ...
    country = models.CharField(max_length=45, choices=COUNTRY_CHOICES)
    nda = models.DateField(blank=True, null=True)
    ...

кортеж (страны) выглядит следующим образом:

(..., ('AR', 'Argentina'), ('AM', 'Armenia'), ('AW', 'Aruba'), ('AU', 'Australia'), ('AT', 'Austria'), ('AZ', 'Azerbaijan'), ('BS', 'Bahamas'), ('BH', 'Bahrain'), ('BD', 'Bangladesh'), ('BB', 'Barbados'), ('BY', 'Belarus'), ('BE', 'Belgium'), ...)

Полученные JSON данные могут или не может содержать значение поля nda . Пример входящего формата данных выглядит следующим образом:

{
    "1": {
        "Vendor": "Firstvendortestname",
        "Country": "Belgium,",
        "NDA date": "",
        "Primary Contact Name": "Jack Jhonson",
        "Primary Contact Email": "jack@gmail.com",
        "Secondary Contact Name": "Jack2 Jhonson",
        "Secondary Contact Email": "jack2@gmail.com",
        "Modules": "Module1, Module2"
    },
    "2": {
        "Vendor": "Secondvendortestname",
        "Country": "Belarus",
        "NDA date": "2019-12-24",
        "Primary Contact Name": "Sandra Bullock",
        "Primary Contact Email": "sandra@gmail.com",
        "Secondary Contact Name": "Sandra Bullock",
        "Secondary Contact Email": "sandra@gmail.com",
        "Modules": "Module1, Module2"
    }
}

В чем проблема.

Первый - "Country": "Belgium," get me error

{
    "status": "{'country': [\"Value 'Belgium' is not a valid choice.\"]}"
}

Но если я перехожу на "Country": "BE,", это работает.

Второй - "NDA date": "", вы получите ошибку

ValidationError at /api/v1/vendors/from_csv_create/
["'' value has an invalid date format. It must be in YYYY-MM-DD format."]

Request Method: POST
Request URL: http://127.0.0.1:8000/api/v1/vendors/from_csv_create/
Django Version: 2.2.9
....
.....

Но у моделей у меня есть null=True и blank=True. И что странно, вторая ошибка печатается в формате text вместо json в качестве первой. Хотя в исключении я указываю return Response(data, content_type='application/json').

Как получить возможность работать с пустым полем и и настроить свою работу?

1 Ответ

1 голос
/ 20 февраля 2020

Для 1-й проблемы это потому, что «Бельгия» не в вашем выборе. Выбор кортежей в основном (accepted_value, human_readable_value). Поэтому, когда вы пишете ("BE", "Belgium"), только «BE» будет считаться допустимым выбором. И это будет показано как "Бельгия" в вашем администраторе.

Если вы хотите принять оба (которые могут не быть необходимыми), есть несколько способов go:

  • Добавьте больше кортежей: (("BE", "Belgium"), ("Belgium", "Belgium"))
  • Создайте пользовательский валидатор для поля

Для вашей второй ошибки "" is not valid date это потому, что пустая строка не является допустимым значением для Дата объекта в Django. Проверьте эту топи c, у которой была та же проблема: Поле DateTime показывает ошибку неверного формата при передаче пустого значения через форму

По сути, вы должны либо пропустить поле, либо заменить "" значение с None перед нажатием

...