2014-09-15 2 views
2

Je comprends que get_or_create est maintenant dépréciée en faveur de l'utilisation upsert, mais comment puis-je faire update_one de retourner l'objet plutôt le nombre d'objets modifiés, et puis je viens de récupérer un objet si je Vous ne voulez rien mettre à jour?MongoEngine: Remplacement get_or_create avec upsert/update_one

par exemple.

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 

renvoie un objet Modèle (un nouvel objet s'il n'existe pas et un objet existant s'il l'est). Quel serait l'équivalent de cela en utilisant la nouvelle méthode?

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) 

est-il un moyen de faire revenir l'objet, et qu'il se comporte exactement comme get_or_create?

Je ne pouvais pas trouver comment faire cela dans le documentation

Répondre

7

Vous êtes très proche mais vous devez utiliser une commande findAndModify via modify plutôt qu'une commande de mise à jour.

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) 

Prenez note des 2 premières modifier kwargs - upsert et new. Prenez également note de l'exemple d'opérateur $setOnInsert qui ne définira un champ que si findAndModify fait un upsert.

+0

Merci pour la réponse. Mais avez-vous une idée de la raison pour laquelle un objet '' QuerySet 'n'a pas d'attribut' modify''? – confused00

+0

Oh, il semble que la commande 'modify' a été rendue disponible depuis la version 0.9, mais la dernière version de pip semble être 0.8.7 – confused00

+0

Vous devrez installer à partir du maître via pip. Voir: http://stackoverflow.com/questions/20101834/pip-install-from-github-repo-branch – Ross

1

Vous devriez regarder modify. En passant un new=True vous obtiendrez l'objet mis à jour (ou document, en langage mongodb).