1

我希望有人能指出我用最 Djangoic 的方式来表示以下与模型的一般关系,以便 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 让我将 As 映射到不同类型的 B。有没有另一种方式来表示 Django 中的 As、Bs 和 Types 之间的关系?

4

2 回答 2

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
于 2013-09-19T08:32:11.083 回答
0

您是否将limit_choices_to视为控制 M2M 范围的一种方式?

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

于 2013-09-19T09:51:45.067 回答