首页 > 解决方案 > 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

标签: pythonjson-apimarshmallow

解决方案


这是基类(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

推荐阅读