1

同じ (オブジェクトへの参照) オブジェクトを ManyToManyField に保存する方法について助けが必要です。たとえば、次のようなモデルがあります。

class Material(models.Model):
    name = models.CharField(max_length=50)

class Compound(models.Model):
    materials = models.ManyToManyField(Material)

この例では、Compoundは 1 つまたは複数の異なるで作成できます。また、同じ2 回 (同じモデル)でMaterial作成することもできます。 MaterialidMaterial

を介して保存しようとすると、最初の と同じであるためModelForm、2 番目Materialは破棄されます。idMaterial

これに最適なアプローチは何ですか?

ありがとうございました!

4

2 に答える 2

3

http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomanyに従ってこれを行うことをお勧めします

class Material(models.Model):
    name = models.CharField(max_length=50)

class Compound(models.Model):
    materials = models.ManyToManyField(Material, through='CompoundMaterials')

class CompoundMaterials(models.Model)
    Material = models.ForeignKey(Material)
    Compound = models.ForeignKey(Compound)
    Quantity = models.IntegerField()

私はここで何をしているんだ?Django は通常、化合物を要素に関連付けるキーのペアを保持するための中間テーブルを自動的に生成します。この場合、私たちはそれを自分で定義していますが、それだけでなく、追加のデータを関係に追加しています。つまり、あなたが話している量です。

使用例として、次のようにします。

$ python manage.py shell
from project.app.models import *

oxygen = Material(name="oxygen")
hydrogen = Material(name="hydrogen")
water = Compound(name="water")

oxygen.save()
hydrogen.save()
water.save()

water_chemistry_oxygen = CompoundMaterials(Material=oxygen, Compound=Water, Quantity=1)
water_chemistry_hydrogen = CompoundMaterials(Material=hydrogen, Compound=Water, Quantity=2)

water_chemistry_oxygen.save()
water_chemistry_hydrogen.save()
于 2010-09-06T16:25:12.593 に答える
1

a を使用しないでくださいManyToManyField-
新しいモデル (MaterialOfCompoundなど) を作成します。このモデルは、2 つの を保持します。1 つForeignKeyMaterialレコード、もう 1 つはCompoundオブジェクトです。

次に、化合物が作られているすべての材料を見つけるには、次を使用できます。

[x.material for x in MaterialOfCompound.filter( compound = my_compound ) ]

または似たようなもの。

于 2010-09-06T16:24:11.637 に答える