Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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
Python Django-对称外键还是级联删除?_Python_Django - Fatal编程技术网

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