Djangoのあるアプリから別のアプリへの外部キー


93

Djangoのmodels.pyファイルで、別のアプリのテーブルへの参照である外部キーを定義できるかどうか疑問に思っていますか?

言い換えれば、私はcfとプロファイルと呼ばれる2つのアプリを持っており、cf / models.pyには(他のものとともに)持っています:

class Movie(models.Model):
    title = models.CharField(max_length=255)

そして、profiles / models.pyに私が欲しい:

class MovieProperty(models.Model):
    movie = models.ForeignKey(Movie)

しかし、私はそれを機能させることができません。私はもう試した:

    movie = models.ForeignKey(cf.Movie)

そして、models.pyの最初でcf.Movieをインポートしようとしましたが、次のようなエラーが常に発生します。

NameError: name 'User' is not defined

この方法で2つのアプリを結び付けようとすることでルールを破っていますか、それとも構文が間違っていますか?

回答:


149

ドキュメントによると、2回目の試行はうまくいくはずです:

別のアプリケーションで定義されたモデルを参照するには、代わりにアプリケーションラベルを明示的に指定する必要があります。たとえば、上記のManufacturerモデルがproductionと呼ばれる別のアプリケーションで定義されている場合は、以下を使用する必要があります。

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

引用してみましたか?


1
関連ドキュメントはこちら
Nathan Jones

多くのアプリに外部キーがあっても大丈夫ですか?私は、プロジェクト内の多くのアプリにわたって、多くの外部キーを持つ多くのアプリを持つプロジェクトをやっています。ファイ、私はすでに質問を始めましたが、答えを待っています。stackoverflow.com/questions/55213918/...
天ルーン

遅くなって、私は知っていますが、それは主に選択と組織の問題です。私はこれまで外部での使用を目的としていない「内部」アプリを持っています。それらは相互に依存し、主に私のファイルと名前空間の便利な編成を提供するために存在します。外部アプリ(DjangoPackagesなど)および私がいつか一般に貢献する可能性があるアプリは、可能な限りそのような依存関係を自由に保つ必要があります(ただし、他のよくサポートされているパブリックドメインアプリへの依存関係は問題ないかもしれません。パブリックユーザー関連のアプリは、Djangoのユーザー/グループ/権限モデルに依存しています)。
nigel222

23

クラス自体を渡すことも可能です。

from django.db import models
from production import models as production_models

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)

9

OK-私はそれを理解しました。あなたはそれを行うことができます、あなたはちょうど正しいimport構文を使わなければなりません。正しい構文は次のとおりです。

from prototype.cf.models import Movie

私の間違いは.modelsその行の一部を指定することではありませんでした。ああ!


10
ファイルを相互にインポートする場合があるため、インポートではなく引用符を使用する必要がある場合があります。
Sam Stoelinga
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.