如何将相同的对象添加到ManyToMany字段?

时间:2010-09-06 16:18:54

标签: django manytomanyfield

我需要有关如何将相同(引用)对象保存到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

最佳方法是什么?

谢谢!

2 个答案:

答案 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 ) ]

或类似的东西。