2010-09-06 23 views
1

我需要关于如何将同一个(引用到)对象保存到ManyToManyField中的帮助。 比如我有模型是这样的:如何将同一对象添加到ManyToMany字段?

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

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

在这个例子中,Compound可以由一个或多个不同Material S,它也可以从相同Material进行两次(同idMaterial模型)。

如果我试图通过ModelForm保存,则会丢弃第二个Material,因为它与第一个Material具有相同的id

这是最好的方法是什么?

谢谢!

回答

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。这是我会做的。 – 2010-09-06 16:26:47

+0

非常感谢! :) – 2010-09-08 05:51:10

0

不要使用ManyToManyField -
创建一个新的模型(MaterialOfCompound,例如),它拥有两个ForeignKey秒 - 一个为Material记录和一个到Compound对象。

然后,找一个复合物制成的所有材料,可以使用:

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

或类似的东西。

相关问题