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

时间:2013-10-21 15:10:30

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

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

Backend db是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组VALUES('The Beatles',1)
   INSERT INTO组VALUES('The Beatles',1)

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

1 个答案:

答案 0 :(得分:0)

简短回答:

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

更多详情:

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

From the Django docs about how the table is named

  

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

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