2

ManyToManyField を使用して多対多の関連付けを宣言する必要がある理由がわかりません。そのためには、2 つの外部キーであるピリオドを含む別のテーブルを作成します。ドキュメントhttps://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomanyの例を次に示します。

from django.db import models

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)
    extraField = models.DateField()

私はただ書くでしょう:

from django.db import models

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

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

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    extraField = models.DateField()

それが正しいか?違いはなんですか?

4

1 に答える 1

2

リレーションシップの中間モデルを定義することに問題はありません。こうすることで、中間モデル (メンバーシップ) に、その人がグループに参加した時期やメンバーシップがまだ有効かどうかなどの追加情報を保存できます。ただし、ほとんどの場合、追加の情報は必要なく、どのユーザーがどのグループのメンバーであるかのみを保存する必要があります。そのような場合、単純なManyToManyField. Django では、これらのフィールドを非常に簡単に操作できるため、次のように比較できgroup.members.add(user)ますgroup.members.delete(user)

Membership.objects.create(user=user, group=group)
Membership.objects.get(user=user, group=group).delete()

免責事項: 疑似コード、実際には機能しない可能性があります

中間モデルで ManyToManyField を引き続き使用できます。これにより、Django ManyToMany のほとんどの便利さが可能になりますが、いくつかの制限があります。

通常の多対多フィールドとは異なり、追加、作成、割り当て (つまり、beatles.members = [...]) を使用して関係を作成することはできません。

なんで?個人とグループの間の関係を作成するだけではありません。メンバーシップ モデルで必要な関係のすべての詳細を指定する必要があります。単純な追加、作成、および割り当ての呼び出しでは、この追加の詳細を指定する方法は提供されません。その結果、中間モデルを使用する多対多の関係では無効になります。このタイプの関係を作成する唯一の方法は、中間モデルのインスタンスを作成することです。

remove() メソッドは、同様の理由で無効になっています。ただし、clear() メソッドを使用して、インスタンスの多対多の関係をすべて削除できます。

中間モデルのインスタンスを作成して多対多の関係を確立したら、クエリを発行できます。通常の多対多関係と同様に、多対多関連モデルの属性を使用してクエリを実行できます。

ソース: docs.djangoproject.com

于 2013-07-23T06:52:54.790 に答える