Автоматическое объединение информации из двух таблиц - PullRequest
1 голос
/ 27 мая 2020

У меня есть две таблицы 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'))

После того, как я запрашиваю таблицу материалов, я конвертирую ее в dict, используя Marshmallow, используя эту схему:

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

И я получаю что-то вроде этого:

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

Однако я бы хотел, чтобы у меня был не идентификатор подсемейства, а его имя напрямую (строка в поле sub_family), когда я получаю материалы Словарь. Так что это своего рода соединение, которое я хочу получать автоматически каждый раз, когда я запрашиваю таблицу материалов. Возможно ли что-то подобное? Спасибо

1 Ответ

1 голос
/ 27 мая 2020

В каждом современном 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")

См. документацию ниже для более подробного объяснения этого topi c : https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html#joined -eager-loading

Или посмотрите это видео-объяснение от PrettyPrintted:
https://www.youtube.com/watch?v=g1oFlq7D_nQ&t=336s

...