限制Django中的ManyToMany关系

时间:2013-09-19 08:00:14

标签: django django-admin foreign-key-relationship m2m

我希望有人可以指出我用Django的最方式来表示以下与模型的一般关系,这样Django现有的逻辑自然会强制实现这种关系。

事物A和事物B都有许多类型之一。事物A可以与许多,一个或没有事物B相关,反之亦然(以对称方式),但是当且仅当它们共享相同类型时,事物A和事物B可以相关。

我目前的实现是有三个模型,A,B和Type,其中As和Bs有一个Type键的外键,A有一个带有B的m2m。

class A(models.Model):
    b = models.ForeignKey(B)
    typ = models.ManyToManyField(Type)

class B(models.Model):
    a = models.ForeignKey(A)

class Type(models.Model):
    name = models.CharField()

这让我可以按照自己的意愿行事,但强制执行 A不能拥有另一种类型的B的事实。我可以在我控制的视图中使用过滤逻辑,但是在我控制较少的地方,比如在Admin中,Django让我映射到不同类型的Bs。还有另一种方法来表示Django中As,Bs和Types之间的关系吗?

2 个答案:

答案 0 :(得分:0)

这将是我的方法:

class A(models.Model):
    typ = models.ManyToManyField(Type)

    @property
    def related2B(self)
        return list of relationships

    def save
        check that relationship is still valid if typ field changes

class B(models.Model):
    typ = models.ManyToManyField(Type)

    @property
    def related2A(self)
        return list of relationships

    def save
        check that relationship is still valid if typ field changes

class Type(models.Model):
    name = models.CharField()


class Relationship(models.Model):
    classA = models.ForeignKey(A)
    classB = models.ForeignKey(B)

    def save
        do check that they share a type before saving

答案 1 :(得分:0)

您是否将limit_choices_to视为控制M2M范围的方法?

复杂查询可以使用Q对象,但我猜不是F对象(对于复杂查询,包括父对象的当前状态),但是如果不合适,你仍然可以拒绝保存