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

Checking if selected many-to-many relation fields are disjoint

我正在尝试创建一个必须满足的条件,然后才能将对象保存到数据库中。我有 table A 和 table 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: None >" needs to have a value for field "foo" before this many-to-many relationship can be used.

我猜它希望在我进行此比较之前将其保存,但重点是在该条件为真之前不将其保存到数据库。如何正确操作?

Model save 方法无法访问 m2m 相关字段,因为它在它们之前被调用。如果你想验证它们,那么你应该为你的 FooAdmin class 定义一个自定义模型表单(我想你正在使用 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