如何在mongoengine中删除EmbeddedDocumentListField中的项目?

问题描述

这是我的数据结构:

{
house_id : 1,houseType : "condo",family: [
            {'name': "pete","gender": "male",etc},{'name': "jon",etc}
        ]
}

如何从EmbeddedDocumentListField中删除“宠物”?

db = MongoEngine()
db.init_app(app)

class Family(db.EmbeddedDocument):
    name = db.StringField()
    gender = db.StringField()


class House(db.Document):
    house_id = db.IntField(required=True,unique=True)
    housingType = db.StringField(required=True)
    family = db.EmbeddedDocumentListField(Family)


@app.route('/api/del_member/<h_id>/<fam_name>',methods=['DELETE'])
def del_member(h_id,fam_name):
    try:
        h = House.objects.get(house_id=h_id)
        t = h.family.get(name=fam_name)
        return make_response(jsonify(t),200)
    except Exception:
        return make_response(f'Something went wrong trying to delete '
                             f'Member: {fam_name} in House ID: {h_id}',500)

im可以选择我感兴趣的项目,但我无法删除它。我试过.delete()但说错了

t = h.family.get(name = fam_name).delete()
AttributeError:“家庭”对象没有属性删除

弹出。

解决方法

我找到了解决方案。可能不是最好的,但它可以工作。希望有人可以对此进行改进。

@app.route('/api/del_member/<h_id>/<fam_name>',methods=['DELETE'])
def del_member(h_id,fam_name):
    h = House.objects.get(house_id=h_id).to_json()
    h = json.loads(h)
    family = h['family']
    new_family = family.copy()

    for i in range(len(family)):
        name = family[i].get('name')
        if name == fam_name:
            del new_family[i]
            break

    House.objects.get(house_id=h_id).update(family=new_family)
    return make_response('',200)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...