8

モデルの「Activity」というクラスの下に、次の ForeignKey フィールドを作成しました。

related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True)

ForeignKey は、空白にすることが許可されている WorkoutRecord というクラスに関連しています。

この列を追加した後、South を実行したところ、次のエラー メッセージが表示されました。

NameError: name 'WorkoutRecord' is not defined

何が起こっているかについて何か考えはありますか?「WorkoutRecord」が私のモデルのクラスであることを確認しました。

たとえば、 WorkoutRecord を文字列 (引用符付き) として記述する必要がありますか?

related_workoutrecord = models.ForeignKey('WorkoutRecord', null=True, blank=True)

フィードバックに感謝します

4

5 に答える 5

14

私のコメントによると、クラス「Activity 」がクラス「 WorkoutRecord 」にアクセスできることを確認してください。

このエラーは、Activity クラスで WorkoutRecord が定義されていないことを意味します。

最初に次の 2 点を確認してください。

1) 輸入しましたか?

2) WorkoutRecord は Activity の前に定義されていましたか?

于 2013-04-23T20:42:24.113 に答える
5

WorkoutRecord クラスは、引用符なしでクラスへの参照を使用するために、Activity クラスの前 (つまり上) に定義する必要があります。クラス間に循環参照がある場合、引用符で囲まれた文字列バージョンを使用すると、コードの後半で定義されたクラスへの遅延参照を取得できます。

于 2013-04-23T20:41:34.430 に答える
4

次の 2 つのオプションがあります。

  1. モデルが存在するどのモジュールからでもモデルをインポートできWorkoutRecordます (これは標準の Python アプローチです)。

    from myapp.models import WorkoutRecord
    related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True)
    

    このアプローチを使用すると、循環インポートが発生する場合があるため、別の方法があります。

  2. ForeignKeyまたはの最初の引数として文字列を使用しManytoManyFieldて、関係を作成するモデルを指定できます。これはジャンゴの機能です。リレーションシップのドキュメントをForeignKey見ると、次のように書かれています。

    まだ定義されていないモデルに関係を作成する必要がある場合は、モデル オブジェクト自体ではなく、モデルの名前を使用できます。

    これは、モデルがまだ定義されていないが、同じモジュールに存在する (つまり、現在のコードの下にある) 場合は、モデル名を引用符で囲んで使用できることを意味します: 'WorkoutRecord'。ただし、モデルが別のアプリケーション/モジュールにある場合は、また、それを文字列として指定します。'myapp.WorkoutRecord'

于 2013-04-23T20:42:58.710 に答える
2

フォーマットを使用'yourapp.Model'します。

foo = models.ForeignKey('yourapp.WorkoutRecord', null=True, blank=True)

引用符付き。

于 2013-04-23T20:40:16.017 に答える
0

1 つのアプリに 2 つのクラス名がある場合は、参照されたクラスの名前の前後に一重引用符 '' を追加してください。

class foreignClass(models.Model):
    category_id = models.ForeignKey('Product_categories', on_delete=models.CASCADE)
于 2019-08-02T17:55:30.063 に答える