60

同じテーブルの2つの外部キーを持つDjangoモデルが必要でした。これは、従業員用の2つの列(「アクター」と「レシーバー」)を持つイベントテーブルです。しかし、私はこのエラーを受け取ります:

エラー:1つ以上のモデルが検証されませんでした:tasks.task:中間モデルTaskEventには、あいまいで許可されていないEmployeeへの複数の外部キーがあります。

これをモデル化するためのより良い方法はありますか?

テーブルを追加するつもりだと思いTaskEvent_to_Employeeます。その中には、それぞれに関連する2人の従業員のそれぞれに1つずつ、合計2つのレコードがありますTaskEvent。誰かがより簡単な回避策を知っていますか?

4

5 に答える 5

113

私はまだこれを行っていませんが、inspectdbを使用して既存のDBからmodels.pyファイルを生成しました。これはまさにそれを実行します。これはinspectdbがスローバックしたものなので、機能するはずです。

creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')

それがあなたのために働くことを願っています-そうでなければ私も問題を抱えることになります。

于 2009-02-24T20:03:41.957 に答える
7

エラー メッセージから、through引数を介して使用される中間テーブル上の同じオブジェクトに 2 つの外部キーを配置しようとしているように思えます。ドキュメントには次のように記載されています。ManyToManyField

中間モデルをセットアップするときは、ManyToMany 関係に関与するモデルへの外部キーを明示的に指定します。この明示的な宣言は、2 つのモデルがどのように関連付けられるかを定義します。

中間モデルにはいくつかの制限があります。

  • 中間モデルには、ターゲット モデルへの外部キーが 1 つだけ含まれている必要があります (この例では Person になります)。複数の外部キーがある場合、検証エラーが発生します。
  • 中間モデルには、ソース モデルへの外部キーが 1 つだけ含まれている必要があります (これは、この例では Group になります)。複数の外部キーがある場合、検証エラーが発生します。
于 2009-02-25T11:17:11.697 に答える
-2

2 つの列が 1 つのテーブルの一部であるという事実は、2 つのフィールドが関連していることを意味するため、それらを個別に参照することは理想的ではありません。モデルの ForeignKey は、参照しているテーブルの主キーである必要があります。

event = models.ForeignKey('event')

次に、列を次のように参照します。

foo.event.actor
foo.event.receiver

必要に応じて、クラス/モデルが外部属性をプロパティで参照する方法を変更することもできます。クラスでは、次のことを行います。

@property
def actor(self):
  return self.event.actor
@property
def receiver(self):
  return self.event.receiver

これにより、 foo.actor と foo.receiver を呼び出すことができますが、長いほど foo.event.actor はよりPythonicになると思います

于 2009-02-24T20:19:46.893 に答える