Die*_*res 7 python mongoengine flask marshmallow
我正在使用棉花糖和mongoengine在Flask上构建和API.当我打电话并且ID应该被序列化时,我收到以下错误:
TypeError: ObjectId('54c117322053049ba3ef31f3') is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我看到了其他库的一些方法来覆盖ObjectId的处理方式.我还没有想到Marshmallow,有谁知道怎么做?
我的模型是:
class Process(db.Document):
name = db.StringField(max_length=255, required=True, unique=True)
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
Run Code Online (Sandbox Code Playgroud)
我的序列化器:
class ProcessSerializer(Serializer):
class Meta:
fields = ("id", "created_at", "name")
Run Code Online (Sandbox Code Playgroud)
并且观点:
class ProcessView(Resource):
def get(self, id):
process = Process.objects.get_or_404(id)
return ProcessSerializer(process).data
Run Code Online (Sandbox Code Playgroud)
dav*_*ism 12
当您只是传递Meta.fields给架构时,Marshmallow会尝试为每个属性选择一个字段类型.由于它不知道它是什么ObjectId,它只是将它传递给序列化的字典.当您尝试将其转储到JSON时,它不知道是什么ObjectId并引发错误.要解决这个问题,您需要告诉Marshmallow要用于id的字段.甲BSONObjectId可以转换为一个字符串,所以使用一个String字段.
from marshmallow import Schema, fields
class ProcessSchema(Schema):
id = fields.String()
class Meta:
additional = ('created_at', 'name')
Run Code Online (Sandbox Code Playgroud)
您还可以告诉Marshmallow该ObjectId类型使用哪个字段,这样您就不必每次都添加字段.
from bson import ObjectId
from marshmallow import Schema, fields
Schema.TYPE_MAPPING[ObjectId] = fields.String
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3902 次 |
| 最近记录: |