我需要如何在同一(参考的),保存对象为ManyToManyField帮助。 例如,我有模型是这样的:
class Material(models.Model):
name = models.CharField(max_length=50)
class Compound(models.Model):
materials = models.ManyToManyField(Material)
在这个例子中, Compound
可以由一种或多种不同的Material
S,并且它也可以由相同的制成Material
两次(同一id
在Material
模型)。
如果我试图通过保存ModelForm
,第二Material
被丢弃,因为它具有相同的id
作为第一个Material
。
什么是我们的最佳方法呢?
谢谢!
我建议这样做,因为每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自动保持对键的化合物相关联以元素生成的中间表。 在这种情况下,我们definiting它自己,但不仅如此,我们还加入额外的数据,即你讲的数量关系。
作为一个例子使用,你可能做的是这样的:
$ 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()
不要使用ManyToManyField
-
创建一个新的模型( MaterialOfCompound
,例如),它拥有两个ForeignKey
秒-一个一个Material
记录和一个到一个Compound
对象。
然后,找一个复合物制成的所有材料,你可以使用:
[x.material for x in MaterialOfCompound.filter( compound = my_compound ) ]
或类似的东西。