MongoEngine:用upsert / update_one替换get_or_create

时间:2014-09-15 10:55:31

标签: django mongoengine

我了解get_or_create现在已被弃用,转而使用upsert,但如何让update_one返回对象而不是修改对象的数量,我可以直接检索一个对象,如果我不想更新任何东西?

e.g。

Model.objects.get_or_create(first_name='John', last_name='Potter', age=40)
# assuming that first_name + last_name + age are enough to uniquiely indentify a person   

返回一个Model对象(如果它不存在则为新对象,如果存在,则返回现有对象)。使用新方法相当于什么?

Model.objects(first_name='John', last_name='Potter', age=40).update_one(upsert=True)
# returns number of objects (1)
Model.objects(first_name='John', last_name='Potter', age=40).update_one(set__first_name='John', set__last_name='Potter', set__age=40,upsert=True)
# returns number of objects (1)

有没有办法让它返回对象,并使其行为与get_or_create完全相同?

我在documentation

中找不到如何执行此操作

2 个答案:

答案 0 :(得分:8)

您非常接近,但您需要通过modify而不是更新命令来使用findAndModify命令。

NewDoc = Model.objects(first_name='John', 
                       last_name='Potter', 
                       age=40).modify(upsert=True, new=True,
                                      set__first_name='John, 
                                      set__last_name='Potter', 
                                      set__age=40,
                                      set_on_insert__newUser=True)

记下前两个修改kwargs - upsertnew。另请注意$setOnInsert运算符示例,该示例仅在findAndModify执行upsert时才设置字段。

答案 1 :(得分:1)

你应该看看modify。通过new=True您将获得更新的对象(或文档,用mongodb的说法)。