Python Django-对称外键还是级联删除?
我有一个模型看起来像这样:Python Django-对称外键还是级联删除?,python,django,Python,Django,我有一个模型看起来像这样: class Bar(models.Model): foo1 = models.ForeignKey(Foo, related_name='bar_foo1') foo2 = models.ForeignKey(Foo, related_name='bar_foo2') class Meta: unique_together = ('foo1', 'foo2') 问题是foo1和foo2倒置时需要有相同的行为。换句话说,它类似
class Bar(models.Model):
foo1 = models.ForeignKey(Foo, related_name='bar_foo1')
foo2 = models.ForeignKey(Foo, related_name='bar_foo2')
class Meta:
unique_together = ('foo1', 'foo2')
问题是foo1
和foo2
倒置时需要有相同的行为。换句话说,它类似于:“如果你喜欢foo1,你可能想签出foo2”,这应该反过来应用(“如果你喜欢foo2,你可能想签出foo1”)
因此,我使用了许多字段而不是ForeignKey来使它们对称:
class Bar(models.Model):
foos = models.ManyToManyField(Foo)
使用信号确保不超过2个foo
:
def foos_changed(sender, **kwargs):
if kwargs['instance'].foos.count() > 2:
raise ValidationError("You can't assign more than two foos.")
m2m_changed.connect(foos_changed, sender=Bar.foos)
但是,这会产生另一个问题,即如果foos
中的Foo
被删除,则条
仅停留在那里,但它也应该被删除(这可以通过在foreignkey中级联删除来解决)
我怎样才能解决这个问题?我能让外键对称吗?或者在多个系统中实现级联删除?或者有其他方法解决这个问题吗?我以前做过,最简单的方法是为模型实例创建一个伪构造函数,以确保项目1和项目2始终有序(我使用字母顺序,但您也可以使用id),这使您的唯一性工作 在查找中,您只需在foo1或foo2中查找您的项,因为您不介意它位于关系的哪一侧,这提供了双向性 有了这里和那里的几个助手,您就有了一个提供建议的智能对象 另一种更具扩展性的方法是创建一个只包含推荐组名称的表,然后将m2m对象添加到推荐组中,这样您就有了一组要推荐的foo,查找就更容易了:foo->group->many foo