1

Django の多対多フィールドを理解するのに苦労しています。

多対多フィールドを作成すると、例:

class GlobalPart (Models.model):
    ...
    category_id=models.ManyToManyField(Category, related_name = 'globalpart')
    ...

class Category (Model.model):
    ...
    category = models.CharField(max_length=250)
    ...

モデルのテーブルappname_globalpart_category_idに加えて、という新しいテーブルが作成されたことに気付きました。appname_globalpartGlobalPart

私が疑問に思っているのは、そのテーブルのフィールド タイプをどのように定義する必要があるかということです。フィールドを関連付けるために少なくとも1つの外部キーが必要だと思います。ただし、代わりにテーブルの主キーがあり、他のフィールドは整数 (globalpart_idおよびcategory_id) です。

だから私の質問は - それは普通ですか? それとも、多対多フィールドを間違って定義したのでしょうか? category_idsそして私の次の質問は、特定の に関連付けられたすべてをどのように取得するのかということGlobalPartです。

4

2 に答える 2

1

外部キーとは何だと思いますか?これは、「外部」テーブルの ID (通常は主キー) と同等の値を含むフィールドです。ほとんどの Django テーブルがそうであるように、他のテーブルに整数キーがある場合、外部キー フィールドも整数型になります。

さらに、Django は、ID が外部テーブルの有効な値を実際に参照するようにデータベースが強制するように、制約を作成します。データベースによっては、これらがフィールド定義の一部として表示される場合と表示されない場合があります。

于 2012-07-26T15:43:23.807 に答える
1

(1) 短い答え: はい、これは正常です。

長い答え: ManyToMany テーブルには、Category テーブルと GlobalPart テーブルの両方への外部キーが必要です。厳密に言えば、これら 2 つの外部キーで十分です。そこに表示される余分な pk は、django マジック専用です。多対多テーブルを自分で手動で定義すると、そのテーブルのこれら 2 つの外部キーだけで本当にうまくいくことができます。ただし、(ManyToManyField を使用して) django に任せると、この追加の pk を取得できます。

(2) モデル フィールドの category_id をカテゴリに変更することをお勧めします。

    class GlobalPart (Models.model):
        categories=models.ManyToManyField(Category, related_name = 'globalpart')

これは、ManyToManyFields が「多くの」項目を適切に参照するためです。このフィールドは「1 つの」category_id を参照するのではなく、関連するすべてのカテゴリを参照します。したがって、名前を付けるときは、それに応じて名前を付けるのが自然です。

すべてのカテゴリにアクセスするには、「categories」プロパティにアクセスします。たとえば、global_part という名前のオブジェクト インスタンスの場合、次のようなカテゴリにアクセスできます。

categories = global_part.categories.all()

all() の代わりに、モデルをクエリするときと同じ方法で filter() または exclude() を使用できます。

関連するdjangoドキュメントへのリンクは次のとおりです

于 2012-07-26T16:18:03.507 に答える