Flask SQLalchemy - 多对多 - 显示带有所有标签的照片(或带有所有帖子的博客等)
Flask SQLalchemy - many to many - show photo with all tags (or blog with all posts etc)
我是 Flask 和 SQLalchemy 的新手。想要包含单张照片的网页显示分配给该照片的所有标签。
我让 SQLalchemy 与 MYSQL 数据库一起正常工作。很好地检索记录等
我需要有关 flask/SQLalchemy 工作流程的帮助:
模型 -> 视图(从 url 输入,例如视图/照片 ID) -> 模板 -> 网页
型号如下:
class Photos(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100))
tags = db.relationship(
'Tags',
secondary=photo_tags,
backref='photos')
class Tags(db.Model):
id = db.Column(db.Integer, primary_key=True)
tagname = db.Column(db.String(100))
photo_tags = db.Table('photo_tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')),
db.Column('photo_id', db.Integer, db.ForeignKey('photos.id'))
)
我的看法如下:
@app.route('/phototags/<int:id>')
#@login_required
def phototags(id=None):
photo_tags = Tags.query.filter(Tags.photos).filter(id == id).all()
return render_template(
'phototags.html',
title='PhotoTags',
message='Your application description page.',
photo_tags = photo_tags
)
我的模板如下:
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
{% for phototag in photo_tags %}
<div style="float:left; class=" img-responsive">
<p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p>
<p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p>
<img src="static/photos/{{ phototag.id }}" width="100" height="100">
</div>
{% endfor %}
{% endblock %}
我很确定模型和关联 table/model 设置正确。
该模板并不完美,因为它目前显示的是照片 ID 的标签 ID。我试过 'phototag.photo_id' 或 'phototag.filename' 但没有出来。显然视图查询没有通过。
所以视图是我需要帮助的。查询是否正确? url 是否正确传递了 photo_id 的参数?
我的测试数据很简单。我有一张 photos.id = 1
的照片记录
这有 2 条相关的 Phototags 记录:phototags.id = 1 (tag.id = 1),phototags.id = 2 (tag.id = 2)
当我传递 url http://localhost:5555/phototags/1 时,我的视图查询传递标签 ID,但更改传递的参数总是得到相同的标签 ID,例如 phototags/2 也得到相同的两个标签。所以查询显然不正确。
我看过很多示例,它们都与我想要的略有不同。 examples/tutorials/SO questions/answers 的 None 我已经看到展示了模型、视图和模板如何协同工作以获得我想要的。他们是:
- 相反,例如按标签相当于照片(按照片要标签)
- 只是通过照片获取标签的查询(我什至不认为我得到了)
- 有另一个 SQLalchemy 表示法,其中包括 'sessions' 或 'base' 而不是 'db.model'
我想要的输出是照片 ID,这样我就可以显示照片及其名称等,还可以显示与该照片相关的标签列表,例如以逗号分隔的列表。
我很难找到一个 demo/example/tutorial/github 项目来引导我完成工作流程所需的内容。
任何人都可以向我展示可以从 url 参数获取照片 ID 然后查询我的模型以获取关联标签的视图示例吗?
从您描述的用例中查询照片而不是 photo_tags 似乎更合适。
带视图功能
@app.route('/phototags/<int:id>')
def phototags(id=None):
photo = Photo.query.get(id)
return render_template(
'phototags.html',
title='PhotoTags',
message='Your application description page.',
photo = photo
)
然后您可以显示照片并使用 html 模板中的 'tags' 关系迭代其标签:
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
<img src="static/photos/{{ photo.id }}" width="100" height="100">
{% for phototag in photo.tags %}
<div style="float:left; class=" img-responsive">
<p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p>
<p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p>
</div>
{% endfor %}
{% endblock %}
请注意,我在查询照片时使用了 get 函数。和
基本一样
Photo.query.filter(id == id).first()
将视图函数和模板从 phototags 重命名为 photo 也很有意义。
如果您想显示标签的所有图像,您必须反转逻辑,查询标签并遍历照片。应该可以,因为你定义了一个backref。
我是 Flask 和 SQLalchemy 的新手。想要包含单张照片的网页显示分配给该照片的所有标签。
我让 SQLalchemy 与 MYSQL 数据库一起正常工作。很好地检索记录等
我需要有关 flask/SQLalchemy 工作流程的帮助:
模型 -> 视图(从 url 输入,例如视图/照片 ID) -> 模板 -> 网页
型号如下:
class Photos(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100))
tags = db.relationship(
'Tags',
secondary=photo_tags,
backref='photos')
class Tags(db.Model):
id = db.Column(db.Integer, primary_key=True)
tagname = db.Column(db.String(100))
photo_tags = db.Table('photo_tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')),
db.Column('photo_id', db.Integer, db.ForeignKey('photos.id'))
)
我的看法如下:
@app.route('/phototags/<int:id>')
#@login_required
def phototags(id=None):
photo_tags = Tags.query.filter(Tags.photos).filter(id == id).all()
return render_template(
'phototags.html',
title='PhotoTags',
message='Your application description page.',
photo_tags = photo_tags
)
我的模板如下:
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
{% for phototag in photo_tags %}
<div style="float:left; class=" img-responsive">
<p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p>
<p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p>
<img src="static/photos/{{ phototag.id }}" width="100" height="100">
</div>
{% endfor %}
{% endblock %}
我很确定模型和关联 table/model 设置正确。
该模板并不完美,因为它目前显示的是照片 ID 的标签 ID。我试过 'phototag.photo_id' 或 'phototag.filename' 但没有出来。显然视图查询没有通过。
所以视图是我需要帮助的。查询是否正确? url 是否正确传递了 photo_id 的参数?
我的测试数据很简单。我有一张 photos.id = 1
的照片记录这有 2 条相关的 Phototags 记录:phototags.id = 1 (tag.id = 1),phototags.id = 2 (tag.id = 2)
当我传递 url http://localhost:5555/phototags/1 时,我的视图查询传递标签 ID,但更改传递的参数总是得到相同的标签 ID,例如 phototags/2 也得到相同的两个标签。所以查询显然不正确。
我看过很多示例,它们都与我想要的略有不同。 examples/tutorials/SO questions/answers 的 None 我已经看到展示了模型、视图和模板如何协同工作以获得我想要的。他们是:
- 相反,例如按标签相当于照片(按照片要标签)
- 只是通过照片获取标签的查询(我什至不认为我得到了)
- 有另一个 SQLalchemy 表示法,其中包括 'sessions' 或 'base' 而不是 'db.model'
我想要的输出是照片 ID,这样我就可以显示照片及其名称等,还可以显示与该照片相关的标签列表,例如以逗号分隔的列表。
我很难找到一个 demo/example/tutorial/github 项目来引导我完成工作流程所需的内容。
任何人都可以向我展示可以从 url 参数获取照片 ID 然后查询我的模型以获取关联标签的视图示例吗?
从您描述的用例中查询照片而不是 photo_tags 似乎更合适。 带视图功能
@app.route('/phototags/<int:id>')
def phototags(id=None):
photo = Photo.query.get(id)
return render_template(
'phototags.html',
title='PhotoTags',
message='Your application description page.',
photo = photo
)
然后您可以显示照片并使用 html 模板中的 'tags' 关系迭代其标签:
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
<img src="static/photos/{{ photo.id }}" width="100" height="100">
{% for phototag in photo.tags %}
<div style="float:left; class=" img-responsive">
<p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p>
<p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p>
</div>
{% endfor %}
{% endblock %}
请注意,我在查询照片时使用了 get 函数。和
基本一样Photo.query.filter(id == id).first()
将视图函数和模板从 phototags 重命名为 photo 也很有意义。
如果您想显示标签的所有图像,您必须反转逻辑,查询标签并遍历照片。应该可以,因为你定义了一个backref。