【问题标题】:Providing initial data for a many-to-many table in Django为 Django 中的多对多表提供初始数据
【发布时间】:2013-10-21 15:10:29
【问题描述】:

我想澄清在原始 SQL 中为使用多对多关系的 Django 模型提供初始数据的格式。我的查询基于this example。我知道在这种情况下,我不需要在 ManyToManyField 中指定 through 参数,但我希望明确列出该表。

后端数据库是 MySQL,表名是小写的类名。

型号:

class Person(models.Model):
    name = models.CharField(max_length=128)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')
    
class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)

我想提供数据的正确方法是:

INSERT INTO person VALUES ('Ringo Starr')
INSERT INTO person VALUES ('Paul McCartney')

INSERT INTO group VALUES ('The Beatles')

INSERT INTO membership VALUES (1, 1)
INSERT INTO membership VALUES (2, 1)

如果我没有明确声明 Membership 表并且没有使用through 参数,我将如何指定这些数据?以下是正确的吗?

INSERT INTO person VALUES ('Ringo Starr')
INSERT INTO person VALUES ('Paul McCartney')

INSERT INTO group VALUES ('The Beatles', 1)
INSERT INTO group VALUES ('The Beatles', 1)

更新:第二种方法不正确。 Group 类下的 members 字段不是真正的 dB 列。

【问题讨论】:

    标签: mysql django django-models many-to-many


    【解决方案1】:

    简答:

    在 SQL 中执行此操作的正确方法与使用 through 时相同,但之前为 membership 的表将具有 Django 生成的名称,如 person_group_a425b,或者您指定的名称Group.members 上的 db_table 参数。

    更多细节:

    即使您没有为将它们连接在一起的表显式创建模型,Django 也会为它们创建一个连接表。

    From the Django docs about how the table is named:

    在幕后,Django 创建了一个中间连接表来表示 多对多的关系。默认情况下,这个表名是使用 多对多字段和包含它的模型的表的名称。自从 有些数据库不支持超过一定长度的表名,这些表名会 被自动截断为 64 个字符,并将使用唯一性哈希。这个 意味着您可能会看到类似 author_books_9cdf4 的表名;这是完全正常的。

    您可以使用 db_table 选项在 ManyToManyfield 的定义中为连接表提供更短/不同的名称。

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 2021-05-21
      • 2013-05-05
      • 2015-09-06
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多