marshmallow-jsonapi:如何重用架构但更改`type_`?

时间:2019-06-17 19:20:17

标签: python json-api marshmallow

我有很多端点,但是它们使用相同的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将需要匹​​配每个端点(foodschatsanimals)。

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

2 个答案:

答案 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

上查看文档以扩展架构并减少代码冗余