我怎么能同一个对象添加到多对多场?(How can I add the same object to

2019-09-27 03:14发布

我需要如何在同一(参考的),保存对象为ManyToManyField帮助。 例如,我有模型是这样的:

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被丢弃,因为它具有相同的id作为第一个Material

什么是我们的最佳方法呢?

谢谢!

Answer 1:

我建议这样做,因为每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()


Answer 2:

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

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

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

或类似的东西。



文章来源: How can I add the same object to a ManyToMany field?