Как выполнить проверку при использовании add () на многих судах отношений в Django? - PullRequest
5 голосов
/ 04 февраля 2010

У меня есть модель категории с отношением родителей / детей к себе Для основной категории и подкатегорий:

class Place(models.Model):
    name = models.CharField(_("name"), max_length=100)
    categories = models.ManyToManyField("Category", verbose_name=_("categories"))

class Category(models.Model):
    name = models.CharField(_("name"), max_length=100)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='child_set')

мне нужно предотвратить сирот, чтобы предотвратить подобные ошибки (в веб-интерфейсе администратора)

c_parent = Category(name='Restaurant')
c_parent.save()

c_child = Category(name="Japanese restaurant", parent=c_parent)
c_child.save()

place1 = Place (name="Planet sushi")
place1.save()
place1.categories.add(c_parent)
place1.categories.add(c_child)

Так что теперь у нас есть новое место под названием "Планета суши", это ресторан (корневая категория) и японский ресторан (подкатегория)

но я хочу предотвратить такие вещи:

place2 = Place (name="Tokyofood")
place2.save()

place2.categories.add(c_child)

потому что родитель не установлен или не является правильной родительской категорией

где я могу сделать проверку формы для администратора? и другие формы (потому что любой пользователь может добавить новое место и должен будет выбрать правильные категории для)

Ответы [ 2 ]

6 голосов
/ 14 апреля 2011

Используйте сигналы и, более конкретно, сигнал m2m_changed .

Найдите время, чтобы прочитать документ, так как сигналы не так легко получить, а m2m_changedсамое сложное, так как это один сигнал для всего, что добавляется к отношениям m2m.

В основном то, что вы хотите проверить, если действие pre_add, затем вызовите ValidationError, если родительский тип не соответствует вашим требованиям.

Потратьте некоторое время на проверку, что такое sender и instance, особенно, поскольку оно изменяется в соответствии со значением reverse.

1 голос
/ 04 февраля 2010

Обновление:

в классе Place добавьте этот метод:

def add_cat(self,cat):
    self.categories.add(cat)
    if cat.parent:
        self.add_cat(cat.parent)

теперь вместо использования place1.categories.add(cat) вы можете использовать place1.add_cat(cat), и он автоматически добавит категорию, родительскую категорию, родительскую категорию и т. Д. это не проверено, но даже если оно не работает, оно должно объяснить все.

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