0

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

后端数据库是 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)

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

4

1 回答 1

0

简短的回答:

在 SQL 中的正确方法与使用时相同through,但membership之前的表将具有 Django like 生成的名称,或者使用参数 onperson_group_a425b指定的名称。db_tableGroup.members

更多细节:

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

从 Django 文档中关于如何命名表

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

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

于 2013-10-21T16:00:29.680 回答