2012-07-10 5 views
9

में डुप्लीकेट के बिना ListField मुझे वास्तव में कुछ याद आना चाहिए। लेकिन मुझे 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) 

addToSet और each के लिए समर्थन वर्तमान में मौजूद नहीं है - देखें: https://github.com/MongoEngine/mongoengine/issues/33