为什么多对多与自我的关系不能是对称的

时间:2017-01-25 09:20:21

标签: django django-models

我试图建立一个与自身有多对多关系的模型,这种关系也会有一个特定的表来存储关于这种关系的一些信息,但是我遇到了一些问题。 / p>

我尝试与Django docs之类的不同模型建立多对多的关系,并且它在我的应用程序的其他一些方面运行良好。但现在我尝试做这样的事情:

让我们说我想要一个表示由其他项目制作的对象(称为Item)的模型,并且还用于制作其他一些项目。例如,一个物体门由木头和锁制成,但门也将用于制作房屋。我为我的模特想到了类似的东西

class Item(models.Model):
    name = models.CharField(max_length=100)
    items = models.ManyToManyField("self",through='IsMadeBy')

class IsMadeBy(models.Model):
    itemResult = models.ForeignKey('Item', related_name='itemResult')
    itemPart = models.ForeignKey('Item', related_name='itemPart')
    amountUsed = models.PositiveIntegerField()

我收到错误消息:

Many-to-many fields with intermediate tables must not be symmetrical.

所以,添加参数

symmetrical=False

我的关系错误停止了。

话虽如此,我想知道这是如何真正起作用的。对于intance,在这个上下文中数据库级别的对称意味着什么?如果有人可以使用SQL语句给出示例,我将不胜感激,因为现在我的大脑无法看到整体情况,并且在与自我的多对多关系中真正学会了这种对称关系的概念。

1 个答案:

答案 0 :(得分:0)

看看Django文档: https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

如果我的朋友是你的朋友那么对称关系那么你也是我的朋友 - 用Django术语说,你有一种关系。

对于非对称的直接和反向关系可以不同,你有related_set。例如,如果我是你的经理,那么你不是我的经理,而是经理通过employee_set可以有很多员工。