Можно реализовать функцию, чтобы проверить, имеет ли экземпляр Listing
хотя бы один экземпляр изображения, и подключить эту функцию к сигналу pre_save модели Listing
Это будет что-то вроде (при условии, что вы используете django 1.3)
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Listing
...
@receiver(pre_save, sender=Listing)
def check_image_requirement(sender, instance, **kwargs):
if instance.images.count() == 0:
raise your_own_exception("Listing is required to have at least one image")
где вам нужно реализовать your_own_exception
Следующее дополнение является ответом на дополнительные вопросы ПО
Реализация Listing.clean()
- это еще один способ достижения того же правила проверки. Действительно, это семантически правильный подход, поскольку Model.clean()
предназначен для пользовательских проверок моделей. Но принятие такого подхода было бы менее удобным - чтобы вызвать clean()
, вам придется либо вручную вызвать full_clean()
(если вы не используете форму модели), либо вручную вызвать is_valid()
(при использовании формы модели), верно перед вызовом save()
экземпляра Листинга. Ссылка
С другой стороны, с помощью подхода pre_save
вы можете быть уверены, что правило проверки всегда применяется к экземпляру Listing
всякий раз, когда вы вызываете save()
для экземпляра.
Это не правильно или неправильно выбирать одно из другого, а просто проектное решение для принятия. Оба подхода могут достичь того, что вам нужно, и сохранить логику бизнеса / домена (т. Е. Правило валидации) на уровне моделей.