3

关系,尤其ManyToMany是 Django 中的关系,一直困扰着我。特别是,由于关系仅在其中一个模型中定义,因此您无法通过查看配对模型来判断它可能隐藏了哪些其他关系。

例如,来自Django 文档

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

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

您可以通过查看代码来判断我会在Pizza.toppings. 但是你不能说我能分辨出比萨饼有什么配料Topping.Pizza_set——你必须看看Pizza课堂才能看到这一点。

结果,通过查看Toppings,我实际上并不知道它拥有的全部领域。

有没有办法解决这个问题或让它更明确?还是我缺少什么?

4

2 回答 2

2

这似乎是 DRY 原则不可避免的副作用。我不知道有任何方法可以声明性地显示这些关系中的对称性(除了通过评论等)。如果你真的想让事情变得明确,你可以把关系放在它自己的表中(无论如何,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 的一些便利。

于 2013-08-08T03:07:25.083 回答
1

在 Django 的论坛上找到了一种方法(链接丢失,抱歉)

class Topping(models.Model):
    explicit_pizza_set = models.ManyToManyField(Pizza, through=Pizza.toppings.through, blank=True)

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)
于 2018-11-11T23:12:49.120 回答