首页 > 解决方案 > 将 2 个具有 1:1 关系的模型组合成一个没有嵌套的方案?

问题描述

我目前有 2 个模型,它们以 1:1 的关系关联,它们将始终一起显示。这些模型通过一个共同的 PK 链接。我创建了两个模型,它们使用flask-sqlalchemy 映射到他们的表。我将在下面制作一个简化版本:

class Author(db.Model):
    key = db.Column(db.Text)
    name = db.Column(db.Text)

class Book(db.Model):
    key = db.Column(db.Text)
    title = db.Column(db.Text)

然后我可以使用烧瓶棉花糖进行序列化:

class AuthorScheme(ma.SQLAlchemyAutoScheme):
    class Meta:
        model = models.Author

class BookScheme(ma.SQLAlchemyAutoScheme):
        class Meta:
            model = models.Book

这对单个方案很有用,我知道您可以使用嵌套,但它不是我想要创建的格式。如果我将作者嵌套在书中,它会产生如下输出:

{
    key: value,
    title: value,
    author: {
        key: value,
        name: value
    }
}

我见过使用模型外键的其他解决方案,它们产生与上述类似的结果。但是,我试图让它像这样序列化:

{
    key: value,
    title: value,
    author: value,
}

这两个模型知道在“键”上合并并合并为一个。这会在实际模型中完成吗?还是在计划中?我搞不清楚了。我也认识到您可以手动执行此操作并设置字段,但我想找到一种更好的方法,因为我将执行获取所有端点并且不希望在所有模型上进行迭代。有任何想法吗?

标签: flasksqlalchemyflask-sqlalchemymarshmallowflask-marshmallow

解决方案


如果您使用的是Marshmallow V3,则可以使用该Pluck字段(此处的文档)。类似于以下内容(未测试):

class AuthorScheme(ma.SQLAlchemyAutoScheme):
    class Meta:
        model = models.Author

class BookScheme(ma.SQLAlchemyAutoScheme):
    class Meta:
        model = models.Book

    author = fields.Pluck(AuthorSchema, 'name')

这应该序列化为:

{
    key: value,
    title: value,
    author: value,
}

推荐阅读