Django自己参照外部キー


165

私はWebアプリケーションやデータベース関連の一般的な知識がまったくないので、これは馬鹿げた質問かもしれません。モデルの別のインスタンス(その親)のプライマリIDを指すフィールドを持つモデル( "CategoryModel")を作成します。

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

どうすればよいですか?ありがとう!


2
文体、私はこれを呼び出すことをお勧めparentの代わりに、parentId以来、my_category_model.parentのインスタンスになりますCategoryModel。Djangoはparent_id、関連モデルの主キーとなるメンバーを自動的に作成します。
10flow

回答:


262

モデルの名前を文字列としてForeignKeyに渡すことができ、それは正しいことを行います。

そう:

parent = models.ForeignKey("CategoryModel")

または、文字列「self」を使用できます

parent = models.ForeignKey("self")

55

文字列 'self'を使用して、自己参照を示すことができます。

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey


7
あなたは「自己」を意味すると思います。文字列のように。自己はこのコンテキストでは定義されていません
Jared Forsyth 2013年

1
@ブランドンあなたの答えの「自己」は、ジャードが彼のコメントで言ったこととどう違うのですか?「私はあなたが「自分」を意味すると思います!!! 。どちらも文字列ですが、django docsによれば問題ありません。!ヒント
Stryker

1
違いはself、モデルプロパティを定義するときに存在しないことです。プロパティが__init__()またはメソッドの一部として定義されている場合selfは、Pythonクラスのインスタンスメソッドの最初の位置引数は常にそうです。
ブランドン、


1

また、null = Trueおよびblank = Trueを設定します

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True、データベースで許可する
blank = True、フォームの検証で許可する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.