简体   繁体   中英

How do i append to EmbeddedDocumentListField in MongoEngine Flask?

Im trying to append additional info to an existing list but i received an error message instead.

Error: 4.Invalid embedded document instance provided to an EmbeddedDocumentField: ['family']

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)

    def to_json(self):
        return {
            "house_id": self.house_id,
            "housingType": self.housingType,
            "family_members": self.family
        }


@app.route('/api/add_family/<h_id>', methods=['POST'])
def add_family(h_id):
    content = request.json
    h = House.objects(house_id=h_id).get()
    h.family.append(content['family'])
    h.save()
    return make_response("Added family member successfully", 201)

What im trying to achieve is as follows:

Current data:

{
  'house_id': 1,
  'family': [{'name': 'John', 'Gender': 'Male'}]
}


After appending, it should look like this:

{
  'house_id': 1,
  'family': [{'name': 'John, 'Gender': 'Male'}, {'name': 'Peter', 'Gender': 'Male'}]
}

Here is my solution. Hopefully it helps.

@app.route('/api/add_family/<h_id>', methods=['POST'])
def add_family(h_id):
    '''
    family member is added only if its not already in the database
    '''
    edited = False
    content = request.json
    h = House.objects.get(house_id=h_id).to_json()
    h = json.loads(h)
    family_arr = h['family']
    if family_arr:
        # family_arr not empty
        count = family_arr[-1].get('id') + 1
    else:
        count = 1

    for new_name in content['family']:
        if not dup_name_check(family_arr, new_name['name']):
            new_name.update({'id': count})
            family_arr.append(new_name)
            count += 1
            edited = True

    if edited:
        House.objects.get(house_id=h_id).update(family=family_arr)
        return make_response(f"Successfully added family member in House ID:{h_id}", 201)
    else:
        return make_response(f"Duplicated entries detected!", 400)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM