2012-07-10 71 views
9

Tôi phải thiếu một cái gì đó thực sự rõ ràng. Nhưng tôi dường như không thể tìm cách để đại diện cho một bộ bằng cách sử dụng mongoengine.ListField không trùng lặp trong 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() 

Mã trên sẽ tạo mục trùng lặp cho i2 trong trường cha mẹ của i1. Làm thế nào để bạn thể hiện một chìa khóa nước ngoài như mối quan hệ trong mongoengine?

Trả lời

11

Thay vì sử dụng append sau đó sử dụng save và để MongoEngine chuyển đổi đó để cập nhật, bạn có thể sử dụng cập nhật nguyên tử và phương pháp $ addToSet - xem the updating mongoDB docs

Vì vậy, trong trường hợp của bạn, bạn có thể làm:

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

Hỗ trợ cho addToSeteach hiện không tồn tại - xem: https://github.com/MongoEngine/mongoengine/issues/33

Các vấn đề liên quan