Привет, подскажите пожалуйста, где лучше определить логику для такого случая:
У меня есть несколько моделей, одна из которых что-то типо
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. А тестировать лучше не через админку, а через тесты
Комментариев нет:
Отправить комментарий