1

我有两个表 Materials 和 MaterialSubFamilies,它们的定义如下:

class MaterialSubFamilies(db.Model):
  sub_family = db.Column(db.String(64), index=True)
  materials = db.relationship('Materials', backref='msub_family', lazy='dynamic')

class Materials(db.Model):
  sub_family = db.Column(db.Integer, db.ForeignKey('material_sub_families.id'))

查询 Materials 表后,我使用 Marshmallow 使用此模式将其转换为 dict:

class MaterialsSchema(ma.ModelSchema):
  class Meta:
    model = models.Materials

我得到的是这样的:

"materials": [
 {"id": 1,
  "name": "bla",
  "msub_family": 2, 
 }]

但是,当我获取 Materials 字典时,我想要的不是 SubFamily 的 id,而是直接的名称(sub_family 字段中的字符串)。所以这是一种我希望在每次查询 Materials 表时自动进行的连接。这样的事情可能吗?谢谢

4

1 回答 1

1

在每一个现代 ORM 中都有一个概念叫做Eager Loading. 这是对一种类型的实体的查询也将相关实体作为查询的一部分加载的过程。

在 SQLAchemy 中,提供了与 相同的概念Joined Eager Loading,要使用它,您只需lazy='joined'MaterialSubFamilies模型中设置即可。

class MaterialSubFamilies(db.Model):
  sub_family = db.Column(db.String(64), index=True)
  materials = db.relationship('Materials', backref='msub_family', lazy='joined')

和..

class MaterialsSchema(ma.ModelSchema):
  class Meta:
    model = models.Materials
    msub_family = fields.Nested("MaterialSubFamiliesSchema")

有关此主题的更详细说明,请参阅以下文档: https ://docs.sqlalchemy.org/en/13/orm/loading_relationships.html#joined-eager-loading

或观看 PrettyPrintted 的视频解释:
https ://www.youtube.com/watch?v=g1oFlq7D_nQ&t=336s

于 2020-05-27T18:37:42.820 回答