MongoEngine更新插入并附加到IntChoiceField的ListField(如果记录存在则附加到列表,否则创建)

问题描述 投票:0回答:1

我对 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)

但在这两种情况下,总是会创建一个新记录,无论它是否存在。我如何在更新时更新插入和追加?

python mongodb mongoengine
1个回答
0
投票

我不知道为什么这些不起作用:

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)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.