我使用Flask-restful
和MongoEngine
,我想在JSON中显示模型的ReferenceField
中的数据。
我有这2个型号,RoomModel
有一个ReferenceField
至UserModel
:
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”字符串。
我该如何解决这个问题?
您需要使用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'}