我对 IntChoiceField 有以下定义:
from mongoengine import IntField
class IntChoiceField(IntField):
def __init__(self, min_value=None, max_value=None, choices: list = None, **kwargs):
super().__init__(min_value, max_value, **kwargs)
self.choices = self.validate_choices(choices=choices)
def validate_choices(self, choices: list):
try:
choice_map = dict(choices)
choice_list = list(choice_map)
choice_list.sort()
return choice_list
except TypeError:
self.error("Choice list is not valid!")
def validate(self, value):
super().validate(value)
if value not in self.choices:
self.error("Invalid Choice")
现在我有一个这样的收藏:
import mongoengine_goodjson as gj
class Collection(gj.Document):
TYPE_1 = 1
TYPE_2 = 2
TYPE_3 = 3
TYPES = [
(TYPE_1, "type_1"),
(TYPE_2, "type_2"),
(TYPE_3, "type_3"),
]
user_id = ObjectIdField()
types = ListField(IntChoiceField(choices=TYPES))
我想查找
user_id
并在没有找到任何内容的情况下创建一条新记录,或者如果找到记录则更新并追加到 types
的列表中。 更新插入第一个找到的记录也可以。
我想我可以做这样的事情:
Collection(user_id=user_id).update(add_to_set__types=1, upsert=True)
或者这个:
Collection(user_id=user_id).update(push__types=1, upsert=True)
但在这两种情况下,总是会创建一个新记录,无论它是否存在。我如何在更新时更新插入和追加?
我不知道为什么这些不起作用:
Collection(user_id=user_id).update(add_to_set__types=1, upsert=True)
Collection(user_id=user_id).update(push__types=1, upsert=True)
但这有效:
Collection.objects(user_id=user_id).update_one(add_to_set__types=1, upsert=True)