2012-07-10 18 views
9

Mi manca qualcosa di veramente ovvio. Ma non riesco a trovare un modo per rappresentare un set usando il mongoengine.ListField senza duplicati in Python mongoengine

class Item(Document): 
    name = StringField(required=True) 
    description = StringField(max_length=50) 
    parents = ListField(ReferenceField('self')) 

i = Item.objects.get_or_create(name='test item')[0] 

i2 = Item(name='parents1') 
i2.save() 
i3 = Item(name='parents3') 
i3.save() 
i.parents.append(i2) 
i.parents.append(i2) 
i.parents.append(i3) 
i.save() 

Il codice precedente creerà una voce duplicata per i2 nel campo genitori di i1. Come esprimi una chiave straniera come la relazione in mongoengine?

risposta

11

Invece di usare append quindi utilizzando save e lasciando MongoEngine convertire che per gli aggiornamenti, è possibile utilizzare gli aggiornamenti atomici e il metodo $ addToSet - vedi the updating mongoDB docs

Quindi nel tuo caso si poteva fare:

i.update(add_to_set__parents=i2) 
i.update(add_to_set__parents=i3) 
i.update(add_to_set__parents=i2) 

Il supporto per addToSet e each non esiste attualmente - vedere: https://github.com/MongoEngine/mongoengine/issues/33

Problemi correlati