检查选定的多对多关系字段是否不相交

时间:2015-06-19 11:08:33

标签: django models

我试图在将对象保存到数据库之前创建一个必须满足的条件。我有表A和表B,A与B有2个独立的多对多关系。我试图在保存条目之前检查这些字段被视为集合的条件是否是不相交的。

以下是一些代码:

class Foo(models.Model):
  first = models.ManyToManyField(Bar, related_name='first')
  second = models.ManyToManyField(Bar, related_name='second')
  def save(self):
    if (set(self.first.all()).isdisjoint(list(self.second.all()))):
      #save
    else:
      #raise exception

但我收到错误

  

"< Foo:没有>"需要有一个领域的价值" foo"在此之前可以使用多对多关系。

我猜测它希望在我进行此比较之前将其保存,但重点是在此条件为真之前不将其保存到数据库。怎么做得好?

1 个答案:

答案 0 :(得分:1)

模型save方法无法访问m2m相关字段,因为它们在它们之前被调用。如果您想验证它们,那么您应该为FooAdmin类定义一个自定义模型表单(我想您正在使用django admin)并在那里进行验证。

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
        exclude = ()

    def clean():
        cd = self.cleaned_data
        first_objects = cd['first']
        second_objects = cd['second']
        # your logic
        return super(FooForm, self).clean()


class FooAdmin(admin.ModelAdmin):
    form = FooForm