2012-07-10 45 views
9

我必須錯過一些非常明顯的東西。但我似乎無法找到一種使用mongoengine來表示集合的方法。ListField在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() 

上面的代碼將在i1的父項字段中爲i2創建一個重複條目。你如何在mongoengine中表達關係這樣的外鍵?

回答

11

而不是使用append然後使用save,讓MongoEngine將其轉換成更新,你可以使用原子更新和$ addToSet方法 - 看the updating mongoDB docs

所以你的情況,你可以這樣做:

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

支持addToSeteach目前不存在 - 請參閱:https://github.com/MongoEngine/mongoengine/issues/33