我有一个小应用程序,我通过烧瓶使用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,我如何将它们映射到“父”对象?
答案 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以了解最佳做法。