Я пытаюсь проверить модель с ManyToManyField
, указывающей на родительскую модель, чтобы она была уникальной в модели прародителя. Это нормально, если у разных бабушек и дедушек есть внуки с одинаковыми именами, но у бабушек и дедушек не может быть двух внуков с одинаковыми именами.
Этот вопрос Обсуждается решение, если отношения ForignKey
s , но здесь это не работает. GrandChild должен быть сохранен, прежде чем я смогу сослаться на родителей, чтобы проверить, является ли он уникальным в пределах GrandParent.
Поскольку родители не могут быть присоединены до тех пор, пока не существует GrandChild, как можно проверить уникальность GrandChild по отношению к GrandParent?
class GrandParent(models.Model):
name = models.CharField(max_length=255)
class Parent(models.Model):
name = models.CharField(max_length=255)
grandparent = models.ForeignKey(GrandParent)
class Meta:
unique_together('name', 'GrandParent')
class GrandChild(models.Model):
name = models.CharField(max_length=255)
parents = models.ManyToManyField(Parent)
def validate_unique(self, exclude=None):
# validate that GrandChild is unique within a given GrandParent
Я попытался добавить метод save()
к методу внука.
def save(self, *args, **kwargs):
grand_parent = self.parents.all()[0].grandparent
grand_children = [child for child in parent.grandchild_set.all() for parent in grandparent.parent_set.all()]
for grand_child in grand_children:
if grand_child.name == self.name and grand_child != self:
raise IntegrityError("must be unique")
Но это дало IntegrityError
ValueError: "<GrandChild: name>" needs to have a value for field "grandchild" before this many-to-many relationship can be used.