我有很多端点,但是它们使用相同的jsonapi模式。
POST /foods
{
"data": {
"type": "food",
"attributes": {
"name": "abc",
"item": "food"
}
}
}
POST /chats
{
"data": {
"type": "food",
"attributes": {
"name": "bcd",
"item": "chat"
}
}
}
POST /animals
{
"data": {
"type": "food",
"attributes": {
"name": "poi",
"item": "animals"
}
}
}
我的模式是:
import marshmallow_jsonapi as jsonapi
ItemSchema(jsonapi.Schema):
id = jsonapi.fields.UUID(dumps_only=True)
name = jsonapi.fields.String(required=True)
item = jsonapi.fields.String(required=True)
class Meta:
type_ = "items"
strict = True
遵循jsonapi标准,type
将需要匹配每个端点(foods
,chats
,animals
)。
import marshmallow_jsonapi as jsonapi
FoodSchema(jsonapi.Schema):
id = jsonapi.fields.UUID(dumps_only=True)
name = jsonapi.fields.String(required=True)
item = jsonapi.fields.String(required=True)
class Meta:
type_ = "foods"
strict = True
import marshmallow_jsonapi as jsonapi
ChatSchema(jsonapi.Schema):
id = jsonapi.fields.UUID(dumps_only=True)
name = jsonapi.fields.String(required=True)
item = jsonapi.fields.String(required=True)
class Meta:
type_ = "chats"
strict = True
import marshmallow_jsonapi as jsonapi
AnimalSchema(jsonapi.Schema):
id = jsonapi.fields.UUID(dumps_only=True)
name = jsonapi.fields.String(required=True)
item = jsonapi.fields.String(required=True)
class Meta:
type_ = "animals"
strict = True
有什么方法可以减少冗余代码,而不必更改ItemSchema
的一堆副本type
?
答案 0 :(得分:2)
这是基类(BaseClass.py)
from marshmallow_jsonapi import fields, Schema
class Base(Schema):
id = jsonapi.fields.UUID(dumps_only=True)
name = jsonapi.fields.String(required=True)
item = jsonapi.fields.String(required=True)
您可以在其他架构中导入Base类
from BaseClass import Base
FoodSchema(Base):
# add other fields if required
class Meta:
type_ = "foods"
strict = True
您需要具有相同字段的其他架构
from Base import Base
ChatSchema(Base):
# add other fields if required
class Meta:
type_ = "chats"
strict = True
答案 1 :(得分:0)
我太迟了一年。但是您可以从BaseSchema
开始扩展,只需更改派生架构中的值
您可以在https://marshmallow.readthedocs.io/en/latest/extending.html#custom-class-meta-options
上查看文档以扩展架构并减少代码冗余