python - marshmallow-jsonapi:如何重用模式但更改`type_`?
问题描述
我有很多端点,但它们使用相同的 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
?
解决方案
这是基类(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)
您可以在其他模式中导入基类
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