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

对于任何缺乏解释以及这篇文章的长度,我提前道歉。我认为这个问题比我想象的要简单得多。我有两个使用一对多关系的模型。对于我的 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 db

from datetime import datetime


class 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() 方法来防止递归发生。但是,我确信阅读此代码已经让您感到胃部不适,我迫切希望有更好的方式来编写它。非常感谢您的任何见解,再次,对于这篇文章的长度或任何缺乏解释,我深表歉意。


ibeautiful
浏览 141回答 1
1回答

四季花海

让您的生活更轻松 - 使用棉花糖。from marshmallow import Schema, fieldsfrom flask import jsonifyclass 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')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python