接上一篇的代碼和數據
對於復雜結構的數據如果只是定義單一結構的話返回的數據就沒意義了,此時定義的數據結構需精確到所有數據的每一個字段
有時候要返回的數據結構中,會有比較復雜的數據結構,證實后可以使用一些特殊字段來實現,如果某個字段的值是list,則使用fields.List、如果某個字段的值是字典,則使用fields.Nested
from flask import Flask
import config
from exts import db
from models import User, Article, Tag
from flask_restful import Api, Resource, fields, marshal_with
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
api = Api(app)
class ArticleView(Resource):
resource_fields = {
'title': fields.String,
'content': fields.String,
'author': fields.String,
'tags': fields.String
}
@marshal_with(resource_fields)
def get(self, article_id):
article = Article.query.get(article_id)
return article
api.add_resource(ArticleView, '/article/<article_id>/', endpoint='article')
使用fields.List和fields.Nested對指定數據嵌套
class ArticleView(Resource):
# 定義要返回的數據結構
resource_fields = {
'title': fields.String, # article.title
'content': fields.String,
'author': fields.Nested({ # article.author
'username': fields.String, # article.author.username
'email': fields.String # article.author.email
}),
'tags': fields.List( # article.tags的list
fields.Nested({ # article.tags[n]
'id': fields.Integer, # # article.tags[n].id
'name': fields.String # # article.tags[n].name
})
)
}
重命名屬性
很多時候面向用戶的字段名稱是不同於代碼中的字段名的,使用attribute可以設置這種修改字段名后的映射,如:'article_title': fields.String(attribute='title'), 返回的article_title實際上是article.title字段的值
class ArticleView(Resource):
# 定義要返回的數據結構
resource_fields = {
'article_title': fields.String(attribute='title'), # article.title
'content': fields.String,
'author': fields.Nested({ # article.author
'username': fields.String, # article.author.username
'email': fields.String # article.author.email
}),
'tags': fields.List( # article.tags的list
fields.Nested({ # article.tags[n]
'id': fields.Integer, # # article.tags[n].id
'name': fields.String # # article.tags[n].name
})
),
}
默認值:
在返回一些字段的時候,有時候沒有值,那么可以指定fields的時候指定一個默認值,如:'count': fields.Integer(default=30)
class ArticleView(Resource):
# 定義要返回的數據結構
resource_fields = {
'article_title': fields.String(attribute='title'), # article.title
'content': fields.String,
'author': fields.Nested({ # article.author
'username': fields.String, # article.author.username
'email': fields.String # article.author.email
}),
'tags': fields.List( # article.tags的list
fields.Nested({ # article.tags[n]
'id': fields.Integer, # # article.tags[n].id
'name': fields.String # # article.tags[n].name
})
),
'count': fields.Integer(default=30)
}