Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Определять значение поля модели спомощью pre_save в моделях или в представлениях при валидации?

Привет, подскажите пожалуйста, где лучше определить логику для такого случая: У меня есть несколько моделей, одна из которых что-то типо
class Drawing(models.Model): ... related_file = models.FileField(upload_to=dfile_location) extension = models.ForeignKey("FileExtension", blank=True, null=True, related_name="+") ...
@property def get_extension(self): ext = "".join(self.related_file.name.split(".")[1:]) return ext
Вторая модель FileExtension которая просто содержит расширения файлов (CharField с названием extension) и первичный ключ. Хочу сделать, чтобы расширение файла определялось автоматически, поэтому в моделях сделал
from django.db.models.signals import pre_save
...
def pre_save_drawing_receiver(sender, instance, *args, **kwargs): if not instance.extension: instance.extension = FileExtension.objects.get(extension__icontains=instance.get_extension)
pre_save.connect(pre_save_drawing_receiver, sender=Drawing)
Вроде все работает, но я с джангой только знакомлюсь и поэтому тестировал это через админку. После, когда дело дошло до форм, в документации вычитал, что недостающие поля формы можно назначить в представлении на этапе валидации или до нее. Вот и вопрос в том, а где лучше или правильнее это делать? В моделях или в представлениях?


Ответ

На самом деле большого значения не имеет, но..
В данном случае Вы всё сделали правильно. Потому что, во-первых, форм у вас может быть несколько - и что, для каждой вы будете код копировать, чтобы расширение файла получать? Ну или, что конечно лучше, наследоваться. Но опять же - а вдруг у Вас первая форма ModelForm, а вторая просто Form? Для последней это вряд ли сработает в варианте "из коробки". Тут можно попробовать какие-нибудь mixin'ы задействовать, но это опять много рутиной работы.
Во-вторых, вы потом может решите всё на асинхронщину переделать и прикрутить какой-нибудь rest-framework, например. И что, в сериализаторах (аналог форм) опять определять логику для получения расширения?
Так что нет, всё у вас правильно и менять не стоит. Универсальное и надёжное решение.
p.s. А тестировать лучше не через админку, а через тесты

Комментариев нет:

Отправить комментарий