2

簡潔な質問: Django (1.5) で、 throughパラメータ
を使用せずに外部テーブルで多対多の関係をモデル化することの利点と欠点は何ですか?

詳細:
カスタム User モデルUserProfileがあり、同じモデルに対して m2m リレーションを定義したいとします。たとえば、次のリレーションを実装します。次のように外部テーブル (モデル) を定義できます。

class Relationship(models.Model):
    """Relationship model"""
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='from_users')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='to_users')
    created = models.DateTimeField(auto_now_add=True)
    is_blocked = models.BooleanField(default=False)
    objects = RelationshipManager()

この場合、以下に示すように UserProfile モデルに m2m フィールドを追加する必要がありますか? はいの場合、なぜですか? Relationshipモデルだけを使用して、ユーザー間のすべての関係を処理できましたね。

class UserProfile(AbstractBaseUser, PermissionsMixin):
    user_following = models.ManyToManyField('self', through=Relationship, symmetrical=False, related_name='followed')
4

2 に答える 2

6

まず、データベースの概念データ モデル (CDM) と物理データ モデル (PDM) を区別することが重要です。

概念的には、UserProfile を別の UserProfile にリンクする場合、2 つのエンティティが必要なようです。

しかし、技術的に (物理的に)、多対多の関係を作成しているため、システムは 2 つの UserProfiles 間の関係を格納するために 3 番目のデータベースを作成する必要があります。

それが OneToOne または OneToMany 関係である場合、技術的には 2 つのテーブルで十分であることに注意してください (このキーワードが ManyToMany 関係でのみ存在する理由を説明しています)。

ここで、Django があなたの生活を楽にしようとしていることを理解してください。「物理的な」レイヤーを気にしない可能性があるかもしれません。たとえば、追加情報なしで、どのユーザーが他のどのユーザーに接続しているかを知りたいだけの場合。

-> その場合、すべてを機能させるための技術的な制約にすぎない 3 番目のテーブルは気にしません。throughキーワードを使用する必要はありません。その場合、Django では 2 つのモデルしか表示されませんが、Django では表示されなくても、データベースには 3 つのテーブルがあります。

しかし、場合によっては (多くの場合、実際には)、この 3 番目のテーブルを使用して、ユーザー間の関係に関する重要な情報を追加できます。たとえば、リレーションが作成された日付を保存する場合は、この 3 番目のテーブルが最適です。

-> この「技術」テーブルは「機能」テーブルになります。ユーザー間の関係に加えて必要なデータが含まれているため、プロジェクトで直接使用したいでしょう! ここで、throughキーワードを使用して Django プロジェクトでこの 3 番目のテーブルを定義し、属性 ( などassocation_date) をこのモデル/テーブルに追加します。これで、Django に 3 つのモデルがあり、データベースにはまだ 3 つのテーブルがあります (追加した追加の属性があります)。

別の古典的な例

クライアントは 1->N 個の製品を注文できます。Product は 0->N クライアントから注文できます。これは明らかに多対多の関係です。

注文に関する情報 (合計金額、日付など) を保存したい場合は、through="Order"クライアントと製品の間の M2M 関係を定義するときに を設定できます。次に、Django で Order モデルを定義します。

于 2014-06-11T00:03:03.797 に答える
0

ジェイコブ・カプラン・モスによって説明された「スルー」使用の利点: http://www.quora.com/Django-web-framework/How-do-you-query-with-a-condition-on-a-ManyToMany-model -Django で

于 2014-06-11T14:05:10.687 に答える