为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Alchemy - 避免一对多关系中的递归

SQL Alchemy - 避免一对多关系中的递归

ibeautiful 2021-11-23 19:28:09
对于任何缺乏解释以及这篇文章的长度,我提前道歉。我认为这个问题比我想象的要简单得多。我有两个使用一对多关系的模型。对于我的 InsightModel,我使用 json() 方法显示以下内容:{    name: "insightname",    start: 1,    end: 3,    podcast_id: 1,    podcast: {        name: "podcast1",        wave_data: 1,        length: 2,        host: "Hosterman",        category: "entertain",        pub_date: "11/1",        cover_art_url: "google.com"    }}对于我的 PodcastModel,json() 方法显示以下内容:{    name: "podcast1",    wave_data: 1,    length: 2,    host: "Hosterman",    category: "entertain",    pub_date: "11/1",    cover_art_url: "google.com",    insights: [        {            name: "insightname",            start: 1,            end: 3,            podcast_id: 1        }    ]}这按我的需要工作,但为了使其工作,我必须为每个类创建两个 json() 方法,以避免在 PodcastModel 中出现如下所示的递归:{    name: "podcast1",    wave_data: 1,    length: 2,    host: "Hosterman",    category: "entertain",    pub_date: "11/1",    cover_art_url: "google.com",    insights: [        {            name: "insightname",            start: 1,            end: 3,            podcast_id: 1,            podcast: {                name: "podcast1",                wave_data: 1,                length: 2,                host: "Hosterman",                category: "entertain",                pub_date: "11/1",                cover_art_url: "google.com",            }        }    ]}我的 PodcastModel 代码是:from db import dbfrom datetime import datetimeclass PodcastModel(db.Model):    __tablename__ = 'podcasts'    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(100))    wave_data = db.Column(db.Float(precision=2))    length = db.Column(db.Float(precision=2))    host = db.Column(db.String(80))    category = db.Column(db.String(80))    pub_date = db.Column(db.String(50))    cover_art_url = db.Column(db.String(200)) 如您所见,我添加了 json_no_insights() 和 json_no_podcast() 方法来防止递归发生。但是,我确信阅读此代码已经让您感到胃部不适,我迫切希望有更好的方式来编写它。非常感谢您的任何见解,再次,对于这篇文章的长度或任何缺乏解释,我深表歉意。
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

让您的生活更轻松 - 使用棉花糖。


from marshmallow import Schema, fields

from flask import jsonify


class PodcastSchema(Schema):

    name = fields.Str()

    wave_data = fields.Float()

    length = fields.Float()

    host = fields.Str()

    category = fields.Str()

    pub_date = fields.Str()

    cover_art_url = fields.Str()

    insights = fields.Nested('InsightSchema')



class InsightSchema(Schema):

    name = fields.Str()

    start = fields.Float()

    end = fields.Float()

    podcast_id = fields.Integer()

然后像这样简单地转储你的数据:


podcast_schema = PodcastSchema()  # for dict (single)

podcasts_schema = PodcastSchema(many=True)  # for list (array)

jsonify(podcast_schema.dumps(your_json)

请注意 - 中缺少podcast字段,PodcastSchema这将导致(无需调整)无限递归。如果您需要该字段,您可以尝试如下操作:


class PodcastSchema(Schema):

        name = fields.Str()

        wave_data = fields.Float()

        length = fields.Float()

        host = fields.Str()

        category = fields.Str()

        pub_date = fields.Str()

        cover_art_url = fields.Str()

        # dump insights without podcast field

        insights = fields.Nested('InsightSchema', exclude=('podcast', ))


class InsightSchema(Schema):

        name = fields.Str()

        start = fields.Float()

        end = fields.Float()

        podcast = fields.Nested('PodcastSchema')


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信