0

I want to clarify the format of providing initial data in raw SQL for a Django model that uses a many to many relationship. I've based my query on this example. I know I'm not required to specify the through parameter in ManyToManyField for this case, but I would like to have the table listed explicitly.

Backend db is MySQL & table names are lowercase Class names.

Model :

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)

I suppose the correct way to provide data would be :

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)

How will I specify this data if I did not declare the Membership table explicitly and didn't use the through parameter? Is the following correct?

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)

UPDATE : The second method isn't correct. The members field under Group class isn't a real dB column.

4

1 に答える 1

0

簡潔な答え:

SQL での正しい方法は を使用する場合と同じですthroughが、以前のテーブルはmembershipのように Django によって生成された名前か、パラメーター on でperson_group_a425b指定した名前のいずれかになります。db_tableGroup.members

詳細:

それらを結合するテーブルのモデルを明示的に作成しなくても、Django はそれらの結合テーブルを作成します。

テーブルの命名方法に関するDjangoドキュメントから

バックグラウンドで、Django は多対多の関係を表す中間結合テーブルを作成します。デフォルトでは、このテーブル名は、多対多フィールドの名前とそれを含むモデルのテーブルの名前を使用して生成されます。一部のデータベースは特定の長さを超えるテーブル名をサポートしていないため、これらのテーブル名は自動的に 64 文字に切り捨てられ、一意性ハッシュが使用されます。これは、author_books_9cdf4; のようなテーブル名が表示されることを意味します。これは完全に正常です。

db_tableオプションを使用して、ManyToManyfield の定義で結合テーブルに短い/異なる名前を指定できます。

于 2013-10-21T16:00:29.680 に答える