Mongoengine:如何更新现有文件的具体领域?

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

我已经露出了一个REST API的现有蒙戈文件。该API请求将包含从任一需要用新的值更新或在其中插入新的值,如果该字段为空文件的某些字段。如何执行在现有mongoengine文档领域的更新?我使用的是棉花糖mongoengine对瓶系列化。

我现在面临的问题是,如果某一个领域中缺少请求负载,调用具有其余字段kwargs更新导致设置丢失的领域为无。如何更新或插入只有在有效载荷中给出的领域?

flask mongoengine marshmallow
2个回答
1
投票

约瑟夫的答案是确定。但另一种答案不会伤害啊!

以下是我使用更新烧瓶mongoengine我的文档

实际的代码:

Game.objects(id = _id).update(
        set__kickoff = request_json.get('kickoff'),
        set__gameid = request_json.get('gameid'),
        set__home_team = request_json.get('home_team'),
        set__away_team = request_json.get('away_team'),
        set__home_win = request_json.get('home_win'),
        set__draw = request_json.get('draw'),
        set__away_win = request_json.get('away_win'),
        set__sport = request_json.get('sport')
        )

Game class : 

    import datetime
    flask_mongoengine import BaseQuerySet, MongoEngine
    db = MongoEngine()

    class Game(db.Document):
    kickoff  = db.DateTimeField(required=True)
    added_on  = db.DateTimeField(default=datetime.datetime.utcnow)
    gameid = db.FloatField(required=True)     
    home_team = db.StringField(required=True)
    home_win = db.FloatField(required=True)    
    draw = db.FloatField(required=True)
    away_win = db.FloatField(required=True)
    away_team = db.StringField(required=True)
    sport = db.StringField(required=True) 
    meta = {
        'collection':'games',
        'queryset_class': BaseQuerySet
    }

PS:记得缩进在Python代码

此外,我注意到你在你的问题标记的棉花糖。在这里,一个样本从他们的官方混帐回购协议here衍生

首先,我们需要一个Mongoengine文件:

import mongoengine as me

class Task(me.EmbeddedDocument):
    content = me.StringField(required=True)
    priority = me.IntField(default=1)


class User(me.Document):
    name = me.StringField()
    password = me.StringField(required=True)
    email = me.StringField()
    tasks = me.ListField(me.EmbeddedDocumentField(Task))

太好了!现在是时候了棉花糖模式。为了保持干燥,我们用棉花糖mongoengine进行映射:

import marshmallow_mongoengine as ma

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User

最后,是时候用我们的模式装载/转储文件:首先,让我们创建一个文档

user_schema = UserSchema()
u, errors = user_schema.load({"name": "John Doe", "email": 
      "[email protected]", "password": "123456","tasks": [{"content": "Find a 
      proper password"}]})
u.save()

如果该文件已经存在,我们可以使用更新更新

u
u2, errors = user_schema.update(u, {"name": "Jacques Faite"})
>>> u2.name
"Jacques Faite"

0
投票

如果您只想更新一个单一的文件,你可以使用Save方法。我就是做这个的。如果文件已经存在,它更新领域,而不是创建一个新文档。

car = Car.objects(pk=car_id) # return a queryset
if car:     
    car = car.get(pk=car_id) # return an object from queryset
    car.make = requestData['make']
    car.model = requestData['model']
    car.mileage = requestData['mileage']
    car.save()

如果您想更新文件很多的话,我建议您查看用户指南的atomic updates部分。

喜欢的东西〜

Car.objects(param="param to filter by").update(set__param=newParam)

“设置”,然后两个下划线是改性剂。还有我上面链接的指南中提供更多的改性剂。

© www.soinside.com 2019 - 2024. All rights reserved.