Лучший способ разрешить% d.% M.% Y-форматированным строкам быть переданными в DateField модели? - PullRequest
1 голос
/ 05 ноября 2019

Я пытался понять влияние настроек DATE_INPUT_FORMATS и то, как Django обрабатывает эти поля данных, но все, что я нахожу, либо мне непонятно (будучи относительно новым для DJango), либо, кажется, относится к формам, которые непохоже, здесь применимо.

У моей модели пользователя есть поле для дня рождения:

class LocalUser(AbstractUser):
    birthday = models.DateField(blank=True, null=True)

, и я хочу создать пользователей из CSV. Я загружаю CSV и обрабатываю его содержимое:

class InputFileForm(forms.Form):
    file = forms.FileField()

    def process_file(self):
        file = io.TextIOWrapper(self.cleaned_data['file'].file, encoding='utf-8-sig')
        reader = csv.DictReader(file, delimiter=";")
        l = LocalUser(**dict(line))
        l.save()

CSV содержит даты, например, в формате «01.01.1999». Это работает, когда я переформатирую даты, например, через line["birthday"] = datetime.strptime(line["birthday"], '%d.%m.%Y'), но я уверен, что должно быть более приятное решение, где мне не нужно изменять код везде, где день рождения передается пользовательской модели в виде строки.

В файле settingy.py я добавил:

#USE_L10N = False
from django.conf.global_settings import DATE_INPUT_FORMATS
DATE_INPUT_FORMATS += ('%d.%m.%Y',)

, но это не помогает.

Полученное сообщение об ошибке:

ValidationError at / import_export / import_data

["'11.02.1993' имеет недопустимый формат даты. Оно должнобыть в формате ГГГГ-ММ-ДД. "]

У вас есть какие-либо рекомендации по решению этой проблемы?

1 Ответ

1 голос
/ 05 ноября 2019

DATE_INPUT_FORMATS относится к формам, поэтому не будет выполнять преобразование при сохранении экземпляра модели.

Вы можете переопределить метод save модели и добавить туда необходимый код преобразования,Также было бы лучше обрабатывать все шаблоны, упомянутые в DATE_INPUT_FORMATS, чтобы сохранить общий источник правды:

from datetime import datetime
from django.conf import settings
from django.core.exceptions import ValidationError


class LocalUser(AbstractUser):
    birthday = models.DateField(blank=True, null=True)

    def save(self, *args, **kwargs):
        if self.birthday is not None:
            if isinstance(self.birthday, str):
                for pattern in settings.DATE_INPUT_FORMATS:
                    try:
                        self.birthday = datetime.strptime(self.birthday, pattern)
                        break
                    except ValueError:
                        continue
                else:
                    raise ValidationError('Not a valid date string')
        super().save(*args, **kwargs)

Теперь, если у вас есть ваши шаблоны, добавленные к DATE_INPUT_FORMATS (как и высделать сейчас), автоматическое преобразование будет иметь место при сохранении.

...