Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 使用ManyToManyField验证祖父母内的唯一性_Django_Django Models_Manytomanyfield - Fatal编程技术网

Django 使用ManyToManyField验证祖父母内的唯一性

Django 使用ManyToManyField验证祖父母内的唯一性,django,django-models,manytomanyfield,Django,Django Models,Manytomanyfield,我正在尝试验证一个模型,其中一个ManyToManyField指向的父模型在祖辈模型中是唯一的。如果不同的祖父母有同名的孙子孙女是可以的,但是祖父母可能没有两个同名的孙子孙女 讨论如果关系为ForignKeys,但在此处不起作用,则解决方案。我必须先把孙辈救出来,然后才能让我的父母去测试,看看孙辈在祖父母身上是否是独一无二的 既然父母在孙辈存在之前无法依附,那么如何根据祖父母验证孙辈的唯一性呢 class GrandParent(models.Model): name = models.

我正在尝试验证一个模型,其中一个
ManyToManyField
指向的父模型在祖辈模型中是唯一的。如果不同的祖父母有同名的孙子孙女是可以的,但是祖父母可能没有两个同名的孙子孙女

讨论如果关系为
ForignKey
s,但在此处不起作用,则解决方案。我必须先把孙辈救出来,然后才能让我的父母去测试,看看孙辈在祖父母身上是否是独一无二的

既然父母在孙辈存在之前无法依附,那么如何根据祖父母验证孙辈的唯一性呢

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")
但这给了整合主义者错误

ValueError: "<GrandChild: name>" needs to have a value for field "grandchild" before this many-to-many relationship can be used.
ValueError:“”需要为字段“孙子”设置一个值,才能使用此多对多关系。

为什么从save方法调用时不能验证唯一性?你可以说,如果一个祖父母包含一个具有x、y、z属性的孙子女的父代,那么鉴于传递给这个孙子女的数据当前正在保存,它将不会是唯一的,因此我仍然会遇到许多问题,其中实例不存在,但我需要该实例来测试唯一性。我知道这是如何工作的,但在这一点上,我还试图对模型进行单元测试(还没有开始实现视图)。我还希望它对接口有效,而不仅仅是视图。我认为您不了解save()是如何工作的,它总是在模型创建时被调用。试着只做
保存(self,*args,**kwargs):raisevalidationerror('Nope')
,然后做
孙子.objects.create(name='bob')
,你会得到
验证错误,视图只是对象创建最常见的接口之一,所以我向你展示了它是如何工作的。您可以执行
grant.objects.create(name='bob',grand'u parent\u id=GrandParent.objects.filter(name='foo')[0].pk)
,它也可以这样工作
def save(self, *args, **kwargs):
    grand_parent_id = kwargs.pop('grand_parent_id')
    if grand_parent_id is None:
        raise SomeException(...)
    grand_parent = GrandParent.objects.get(pk=grand_parent_id)
    for parent in grand_parent.parent_set.all():
        for grand_child in parent.grandchild_set.all():
           if grand_child.name == self.name:
               raise IntegrityError("Name must be unique")

# views.py
grand_parent = get_object_or_404(GrandParent, pk=kwargs.get('grand_parent_pk'))
if form.is_valid():
    form.save(grand_parent_id=grand_parent.pk)