与子项(嵌套)外键的外键关系

时间:2014-03-06 06:13:46

标签: flask flask-sqlalchemy

我有一个小应用程序,我通过烧瓶使用flask-sqlalchemy进行渲染:

我有一个表设置,以便:

表A

表B带有表A的外键

表C和表D带有表B的外键

表A有很多孩子B,而表B有很多孩子C和D

表格可在此处找到:http://pastebin.com/xYLqj9vw

我可以使用如下查询成功查询和获取A中的对象:

@app.route('/<video>/')
def show_specific_video(video):
    video = Video.query.filter_by(id=video).first_or_404()
    return render_template('video.html', video=video)

并在视野中:

{% for source in video.files %}
    blah...
{% endfor %}

但是,如果我尝试渲染(使用{{}})源中的外键(source.video_codec等),我所得到的只是外键引用(例如,它引用的video_file的id为1)。我不知道如何获取嵌套外键引用的对象对象。我怎么能这样做呢?

如果我单独查询每个C和D,我如何将它们映射到“父”对象?

1 个答案:

答案 0 :(得分:1)

在您定义的VideoFile模型中:

video_codec = db.Column(db.Integer, db.ForeignKey(VideoCodec.id))

所以说你有一些视频文件:

source = VideoFile.query.get(1)

你这样做

source.video_codec

您实际上是在引用您在VideoFile模型上设置的外键,而不是关系。

在您的VideoCodec模型中,您已经定义了一个关系:

videos = db.relationship('VideoFile', backref='Video Codec')

在这里,您已使用空格定义了backref。我测试了它,它是有效的。这是在VideoFile模型上设置属性“Video Codec”。您无法通过属性访问来访问它,即:
source.Video Codec会将解释器混淆在哪里寻找source.Video并想知道Codec指向的变量。要获得您想要的内容,请执行以下操作之一:

getattr(source, 'Video Codec')

或将您的关系名称更改为无空格

videos = db.relationship('VideoFile', backref='Video_Codec')

现在source.video_codec将为您提供外键,source.Video_Codec将为您提供实际关系。

我还建议您将VideoFile.video_codec重命名为VideoFile.video_codec_id以避免让自己感到困惑。如果您这样做,请不要忘记更改对它的任何引用。

请详细阅读sqlalchemy relationship configuration以了解最佳做法。