2010-09-06 50 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) ] 

或類似的東西。