Объединить 2 модели с соотношением 1: 1 в одну схему без вложенности? - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время у меня есть 2 модели, которые связаны соотношением 1: 1, которое всегда будет отображаться вместе. Модели связаны через общий ПК. Я создал две модели, которые отображаются на их таблицы, используя 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,
}

Где две модели знают, что они объединяются в «ключ» и объединяются в одну. Будет ли это сделано в реальных моделях? Или в схеме? Я потерян. Я также признаю, что вы можете сделать это вручную и установить поле, но я хотел бы найти лучший подход, так как я буду делать все конечные точки и предпочел бы не выполнять итерации на всех моделях. Есть идеи?

1 Ответ

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

Если вы используете 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,
}
...