6

システムモデルとインターフェイスモデルがあります。インターフェイスは、2 つのシステム間の組み合わせです。以前は、このインターフェイスは Excel シート (クロス テーブル) として表されていました。今、私はそれをデータベースに保存したいと思います。

System への 2 つの外部キーを使用して、Interface モデルを作成してみました。次の理由により、これは機能しません。

  • ターゲット モデルに 2 つの異なる逆関係を作成します。
  • 重複を避けることはできません (最初と 2 番目の rel が入れ替わっています)。

私はこのコードを使用しました:

class SystemInterface(Interface):
    assigned_to = models.ManyToManyField(User)
    first_system = models.ForeignKey(System)
    second_system = models.ForeignKey(System)

これを行うより良い方法はありませんか?

対称的な関係が必要です。システムがインターフェイスの「最初」または「2番目」であることは問題ではありません。

4

3 に答える 3

4

これらのモデルを最も簡単に表すには、次のようにします。

class System(models.Model):
    pass

class Interface(models.Model):
    assigned_to = models.ManyToManyField(to=User)
    system = models.ForeignKey(System)

    @property
    def systems(self):
        Interface.objects.get(system=self.system).interfacedsystem_set.all()         

class InterfacedSystem(models.Model):
    interface = models.ForeignKey(Interface)
    system = models.ForeignKey(System)

インターフェイス化されたシステムの追加/削除は、明らかに読者の演習として残されています。配置はかなり簡単なはずです。

于 2012-11-06T14:45:49.133 に答える
2

追加のフィールドを使用して多対多の関係を使用できますが、対称に​​することはできません。

多対多の関係に使用されるテーブルには、2 つのモデル間の関係ごとに行が含まれています。システムから自己への多対多の関係に使用されるテーブルには、2 つのシステム間の関係ごとに 1 つの行があります。これは、モデルがManyToManyField.throughに使用されるモデルの構造に適合するという事実と一致しています 。

中間モデルを使用すると、assigned_to などのフィールドを多対多テーブルに追加できます。

わかりにくいかもしれませんが、SystemInterface(left_system=system_ a , right_system=system_ b ) の作成を防ぐ必要があります。「左」側と「右」側を持つ多対多の関係行/インスタンスを表す目的で、「最初」を「左」に、「2 番目」を「右」に変更したことに注意してください。

これらは対称にできないため、1 つの SystemInterface(left_system=system_ a , right_system=system_ b ) と 1 つの SystemInterface(left_system=system_ b , right_system= system_ a ) を持つという問題は解決されません。SystemInterface のclean() メソッド、または ManyToManyField.through モデルを使用して多対多テーブルを表すために使用されるモデルでそれが発生しないようにする必要があります。

于 2012-10-30T12:14:32.550 に答える