Flask-restful如何在mongoengine的reference_field中使用marshal_with()`数据?

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

我使用Flask-restfulMongoEngine,我想在JSON中显示模型的ReferenceField中的数据。

我有这2个型号,RoomModel有一个ReferenceFieldUserModel

class RoomModel(Document):
    meta = {'allow_inheritance': True}

    room_name = StringField()
    created_by = ReferenceField(UserModel)

class UserModel(Document):

    username = StringField()
    email = StringField()

我想marshal_with()从mongoengine查询到响应的所有数据,所以我这样做:

     room_model_fields = {
        'room_name': fields.String,
        'created_by': fields.String(attribute=UserModel._id)
    }

    room_model_fields_format = {
        'rooms': fields.List(fields.Nested(room_model_fields))
    }


    @staticmethod
    @marshal_with(room_model_fields_format)
    def get():
        room = RoomModel.objects().all() 
        return {'rooms': room},200

我收到此回复:

{
 rooms": [
    {
      "room_name": "mobile_legend",
      "created_by": "UserModel object" <<--Now: This only return a string with "UserModel object"
      "created_by": "SOME_ID_STRING"  <<-- THIS IS WHAT I WANT
    }
  ]
}

[我看到我的数据库,它有一个带有created_by: SOME_ID_STRING_HERE的字段,我想在响应中显示SOME_ID_STRING而不是“ UserModel object”字符串。

我该如何解决这个问题?

python mongodb flask mongoengine flask-restful
1个回答
0
投票

您需要使用attribute='created_by.id'。请参见下面的示例:

from mongoengine import StringField
from flask_restful import fields, marshal_with

class Car(Document):
    brand = StringField()

class User(Document):
    car = ReferenceField(Car)
    name = StringField()

car = Car(brand='VW').save()
user = User(car=car, name='John Doe').save()

@marshal_with({'name': fields.String, 'id': fields.String, 'car_id': fields.String(attribute='car.id')})
def get():
    return user

print(dict(get()))    # {'car_id': u'5e124e83aa7a179157418ab2', 'name': u'John Doe', 'id': u'5e124e83aa7a179157418ab3'}
© www.soinside.com 2019 - 2024. All rights reserved.