我需要有关如何将相同(引用)对象保存到ManyToManyField中的帮助。 例如,我有这样的模型:
class Material(models.Model):
name = models.CharField(max_length=50)
class Compound(models.Model):
materials = models.ManyToManyField(Material)
在此示例中,Compound
可以由一个或多个不同的Material
组成,也可以从相同的 Material
两次制作(id
模型中的Material
相同。)
如果我尝试通过ModelForm
进行保存,则会丢弃第二个Material
,因为它与第一个id
具有相同的Material
。
最佳方法是什么?
谢谢!
答案 0 :(得分: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()
答案 1 :(得分:1)
请勿使用ManyToManyField
-
创建一个新模型(例如MaterialOfCompound
),其中包含两个ForeignKey
s - 一个到Material
记录,一个到Compound
个对象。
然后,要查找化合物的所有材料,您可以使用:
[x.material for x in MaterialOfCompound.filter( compound = my_compound ) ]
或类似的东西。