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

标签 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: None >" needs to have a value for field "foo" before this many-to-many relationship can be used.

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

最佳答案

模型 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

关于django - 检查选定的多对多关系字段是否不相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936652/

相关文章:

python - geodjango 从原始 SQL 返回 geojson

c++ - qml : data models in models 中的嵌套列表

python - Django表单小部件不显示错误

python - 如何自动化使用 pyinstaller 和 innosetup 创建的 Django-App_EXE

python - Django 与巨大的 mysql 数据库

django - 如何在 django orm 中使用 count 函数作为 case 语句的条件

ruby-on-rails - Rails ActiveRecord 关系 - 有很多并且属于关联

ruby-on-rails - 外键 : belongs_to & has_one difference

java.lang.NumberFormatException : empty string - OBJ Model Loader

database - 与另一个模型或父模型的多态关联