【问题标题】:Combine 2 models with 1:1 relation into one scheme without nesting?将 2 个具有 1:1 关系的模型组合成一个没有嵌套的方案?
【发布时间】:2020-08-15 05:50:46
【问题描述】:

我目前有 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)

然后我可以使用 flask-marshmallow 进行序列化:

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,
}

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

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy marshmallow flask-marshmallow


    【解决方案1】:

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

    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,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多