2010-09-06 5 views
1

J'ai besoin d'aide pour sauvegarder le même objet (référence à un objet) dans un ManyToManyField. Par exemple, j'ai modèles comme ceci:Comment ajouter le même objet à un champ ManyToMany?

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

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

Dans cet exemple, le Compound peut être composé d'un ou plusieurs Material s, et il pourrait également être fait à partir du double mêmeMaterial (même id dans Modèle Material).

Si je tente de sauver par un ModelForm, le second est Material mis au rebut parce qu'il a la même id que le premier Material.

Quelle est la meilleure approche pour cela?

Merci!

Répondre

3

Je vous conseille de faire cela comme par 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() 

Qu'est-ce que je fais ici? Eh bien, Django génère normalement automatiquement une table intermédiaire pour contenir des paires de clés associant des composés à des éléments. Dans ce cas, nous le définissons nous-mêmes, mais pas seulement, nous ajoutons des données supplémentaires à la relation, c'est-à-dire la quantité dont vous parlez.

Comme un exemple d'utilisation, ce que vous pourriez faire est la suivante:

$ 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. C'est ce que je ferais. –

+0

Merci beaucoup! :) –

0

Ne pas utiliser un ManyToManyField -
Créer un nouveau modèle (MaterialOfCompound, par exemple), qui détient deux ForeignKey s - un à un enregistrement Material et un à un objet Compound.

Ensuite, pour trouver tous les matériaux un composé est fait, vous pouvez utiliser:

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

ou quelque chose de similaire.

Questions connexes