у меня есть модель Category с родителем/ребенком сам отношение Для основной категории и sub категорий:
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)
Таким образом, теперь у нас есть новое Место, названное "Суши планеты", это - Ресторан (корневая категория) и японский Ресторан (sub категория)
но я хочу предотвратить такого рода вещи:
place2 = Place (name="Tokyofood")
place2.save()
place2.categories.add(c_child)
потому что родитель не установлен или не является корректной родительской категорией
где я могу сделать проверку формы для администратора? и другие формы (потому что любой пользователь может добавить новое место и должен будет выбрать корректные категории для),
обновление:
в классе 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)
, и он автоматически добавит категорию , и его родительская категория, и его родительская категория и так далее. это не проверено, но даже если это не сработает, оно должно донести суть.