How to delete an item in EmbeddedDocumentListField in mongoengine?

358 Views Asked by At

Here is my data structure:

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

How do i delete 'pete' from the 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 able to select the item im interested in but i cant delete it. I have tried .delete() but an error saying

t = h.family.get(name=fam_name).delete()
AttributeError: 'Family' object has no attribute 'delete'

pops up.

1

There are 1 best solutions below

0
On

I found a solution. Might not be the best but it works. Hopefully someone can improve on it.

@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)