Модели Django - по крайней мере, один из многих ко многим - PullRequest
7 голосов
/ 07 марта 2012

Как я могу убедиться, что установлено хотя бы одно отношение «многие ко многим»?

Например: если у меня есть модель listing, в которой есть поле image со многими комногие относятся к images.Как я могу убедиться, что установлено хотя бы одно изображение

Бонусный вопрос: что если минимум был чем-то отличным от одного?А как насчет максимума?

1 Ответ

3 голосов
/ 07 марта 2012

Можно реализовать функцию, чтобы проверить, имеет ли экземпляр 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() для экземпляра.

Это не правильно или неправильно выбирать одно из другого, а просто проектное решение для принятия. Оба подхода могут достичь того, что вам нужно, и сохранить логику бизнеса / домена (т. Е. Правило валидации) на уровне моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...