SQLAlchemy Meta Class Marshmellow 中的自定义字段名称

Custom field names in SQLAlchemy Meta Class Marshmellow

我正在尝试使用 .dump 从我的 sqlAlchemy 查询中使用 marshmallow 来获得查询结果,但我想自定义字段的名称(与数据库 table 列不同name) 发送到前端。

所以如果我的 table 模式是:

class SomeRandomName(db.Model):
    __tablename__ = 'some_random_name'
    id = db.Column(db.Integer, primary_key=True)
    time = db.Column(db.DateTime, default=datetime.utcnow)
    title = db.Column(db.String(30), unique=False, nullable=True)
    some_column_name = db.Column(db.String(30), unique=False, nullable=True)

我的 Marshmallow Schema 是:

class SomeRandomNameSchema(ma.Schema):
    class Meta:
        fields = ["time", "title", "some_column_name"]

响应将是:

[
    {"time": "2020-07-17 07:18:44",
    "title": "Some Title",
    "some_column_name": false}
]

但我真正想要的是我的列名在 DB 中保持不变,但在 JSON 响应中更改 Key 而无需在 .dump 之后操作 JSON。

例如:

[
    {"time": "2020-07-17 07:18:44",
    "title": "Some Title",
    "CulmnNameChanged": false}
]

我也尝试了 中的建议答案,但我最终得到一个空的 JSON 响应。

我获取数据的唯一方法是将 fields = ["time", "title", ...] 放入我的 Class Meta

因此,在按照评论中的要求创建可重现示例的过程中,我最终找到了答案,即通过将 many=True 添加到 Marshmallow 架构 class 中,因为我使用的是 .all() 在我的查询中,也使用 作为我的模式结构。

如果有人遇到问题,我将把它留在这里作为示例:

from app import db, ma
from marshmallow import fields


class Table(db.Model):
    __tablename__ = 'table'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(30), unique=False, nullable=True)


class TableSchema(ma.Schema):
    class Meta:
        strict = True
    newTitleName = fields.String(attribute="title")


def my_function():
    _query = db.session.query(Table).all()
    ser = TableSchema(many=True)
    result = ser.dump(_query)
    print(result)


my_function()