【问题标题】:Why Many to Many relationship with self can't be symmetrical为什么与自我的多对多关系不能对称
【发布时间】:2017-06-10 09:40:22
【问题描述】:

我正在尝试创建一个与自身具有多对多关系的模型,并且该关系还将有一个特定的表来存储有关该关系的一些信息,但我遇到了一些问题。

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

假设我想要一个模型来表示由其他项目制作的对象(称为项目),也用于制作其他一些项目。例如,一个物体门是由木头和锁制成的,但门也将用于制作房子。我想为我的模型做这样的事情

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

对于我的关系,错误停止了。

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

    如果我是你的朋友,那么你也是我的朋友,如果我是你的朋友,那么你也是我的朋友——在 Django 术语中,你有一个关系。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多