Django的人际关系,尤其是ManyToMany,总是让我有些困扰。特别是,由于关系仅在其中一个模型中定义,因此从成对模型中看不出它可能隐藏了哪些其他关系。
例如,从Django Documentation

class Topping(models.Model):
    # ...

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

从代码中可以看出,我可以在Pizza.toppings找到比萨饼的相关配料。但你不能说我能告诉你什么比萨饼在Topping.Pizza_set有一个顶部-你必须看看Pizza类才能看到这一点。
因此,通过查看Toppings,我实际上不知道它拥有的字段的完整范围。
有什么办法可以解决这个问题或者让它更明确?或者是我遗漏了什么?

最佳答案

这似乎是干原则不可避免的副作用。我不知道用什么方式来说明这些关系中的对称性(除了注释之类的)。如果你真的想把事情说清楚,你可以把关系放在它自己的表中(Django在幕后做的事情),比如:

class Topping(models.Model):
    # ...

class Pizza(models.Model):
    # ...

class PizzaToppings(models.Model):
    # '+' disables the reverse relationship
    pizza = models.ForeignKey(Pizza, related_name='+')
    topping = models.ForeignKey(Topping, related_name='+')

... 当然,你会失去一些ORM的便利。

10-06 08:50