gpt4 book ai didi

mysql - 为 Django 中的多对多表提供初始数据

转载 作者:行者123 更新时间:2023-11-30 01:10:23 25 4
gpt4 key购买 nike

我想澄清在原始 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 列。

最佳答案

简短回答:

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

更多详细信息:

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

From the Django docs about how the table is named :

Behind the scenes, Django creates an intermediary join table to represent the many-to-many relationship. By default, this table name is generated using the name of the many-to-many field and the name of the table for the model that contains it. Since some databases don’t support table names above a certain length, these table names will be automatically truncated to 64 characters and a uniqueness hash will be used. This means you might see table names like author_books_9cdf4; this is perfectly normal.

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

关于mysql - 为 Django 中的多对多表提供初始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com