3

コンピューターのハードウェアをまとめたアプリを作っています。djangoを使うのはこれが初めてです。次のモデルがあるとします。

class Memory(models.Model):
    partNum = models.CharField()
    capacity = models.CharField()

class Computer(models.Model):
    name = models.CharField()
    memory = models.ManyToManyField(Memory)
    # also has cpus, hard drives, and motherboard, but focus on memory for now

1つのメモリオブジェクトは多くのコンピュータオブジェクトに属することができ、1つのコンピュータオブジェクトは多くのメモリオブジェクトを持つことができます-多対多。ただし、複数のメモリースティックを使用する場合は、コンピューターにまったく同じメモリースティックを取り付ける必要があります。

それでも、djangoのmanytomanyフィールド(デフォルトでは?)は、メモリとコンピュータの関係の1つのインスタンスのみを許可します。これは、私が一意である必要があります。これを回避する方法はありますか?

管理ページで、同じメモリオブジェクトの多くをコンピュータに追加しようとすると、「このコンピュータとメモリとのコンピュータとメモリの関係はすでに存在します」と表示されます。manage.pyシェルのサーバーオブジェクトに同じメモリオブジェクトを複数回追加しようとすると、追加されたメモリオブジェクトは1つだけであるように見えます。重複するエントリを持つようにデータベースを手動で編集しようとすると、エントリがすでに存在するというエラーが表示されます。データベース構造では、ある種の「一緒にユニークな」インデックスが強制されていることがわかります。その句を削除するようにテーブルを変更した場合、それで問題は解決しますか?おそらく、djangoマネージャーが予想よりも愚かでない限り、そうではありません。

私のオプションは何ですか?私自身の中間モデルを書いて、through構成を使用しますか?しかし、それでは、クールなfilter_horizo​​ntalウィジェットを使用できなくなります。コンピューターモデルを書き直して、外部キーフィールドとメモリオブジェクトの数のフィールドを追加しますか?しかし、その後、ManyToManyAPI機能を取得できません。ヘルプ!

4

2 に答える 2

7

編集:申し訳ありませんが、「スルー」を使用したくないというあなたの投稿を十分に読んでいませんでした。

この問題を回避する 1 つの方法は、"through" パラメーターを使用することです。このパラメーターでは、多対多の関係に使用する中間モデルを手動で指定できます。このようにして、Django が提供する多対多の機能 (のほとんど) を引き続き使用する必要があります。

次に、中間モデルにカウントを含めることができます (複数の関係を持つよりも管理しやすいと思います)。

class Memory(models.Model):
    partNum = models.CharField()
    capacity = models.CharField()

class Computer(models.Model):
    name = models.CharField()
    memory = models.ManyToManyField(Memory, through='ComputerMemory')

class ComputerMemory(models.Model):
    memory = models.ForeignKey(Memory)
    computer = models.ForeignKey(Computer)
    count = models.IntegerField()

詳細については、Django のドキュメントを参照してください: https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

于 2012-12-14T20:38:07.990 に答える
0

いいえ、これは妥協ではありません。スルー用に別のテーブルを作成しなくても、django は各コンピューターに関連付けられているメモリを正確に記憶するためにテーブルを作成するので、自分で作成することをお勧めします...そしてこれも特定のメモリを搭載した特定のコンピューターに必要な他のフィールドをそこに取得できます

于 2012-12-15T12:20:03.667 に答える