1

我需要有关如何将相同(引用)对象保存到 ManyToManyField 的帮助。例如我有这样的模型:

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

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

在此示例中,Compound可以由一个或多个不同Material的 s 制成,也可以由相同Material两次制成(模型相同)。idMaterial

如果我尝试通过 a 保存ModelForm,第二个Material将被丢弃,因为它与id第一个相同Material

最好的方法是什么?

谢谢!

4

2 回答 2

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()
于 2010-09-06T16:25:12.593 回答
1

不要使用 a ManyToManyField-
创建一个新模型(MaterialOfCompound例如 ),其中包含两个ForeignKeys - 一个用于Material记录,一个用于Compound对象。

然后,要查找构成化合物的所有材料,您可以使用:

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

或类似的东西。

于 2010-09-06T16:24:11.637 回答