Flask SQLalchemy多对多显示带有所有标签的照片(或包含所有帖子的博客等)

2024-09-24 22:32:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉烧瓶和炼金术。想要有一个单独的照片,显示所有标签分配给该照片的网页。在

我有SQLalchemy可以很好地使用MYSQL数据库。很好地检索记录等

我需要关于烧瓶/炼金术工作流程的帮助:

模型->查看(从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'))
)

我的看法是:

^{pr2}$

我的模板如下:

{% 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 %}

我很确定模型和关联表/模型设置正确。在

模板并不完美,因为它目前显示的是照片id的标签id。我试过phototag.photo\u id'或'phototag.filename“但是没有出来。显然,视图查询并没有实现这一点。在

所以我需要帮助的就是这个观点。查询正确吗?它是否正确地获取了照片的url传递参数?在

我的测试数据很简单。我有一张照片.id=1

这有两个相关的Phototags记录:照片标签.id=1(标签id=1),照片标签.id=2个(标签id=2)

当我传递url http://localhost:5555/phototags/1时,我的视图查询传递标记id,但是更改传递的参数总是得到相同的标记id例如phototags/2也得到相同的两个标记。所以这个查询显然是不正确的。在

我看过很多例子,它们都与我想要的有细微的不同。我看到的示例/教程/SO问题/答案都没有显示模型、视图和模板如何协同工作以获得我想要的结果。它们是:

  • 获取相反的东西,例如相当于按标签的照片(想要标签的照片)
  • 只是通过照片获取标签的查询(我甚至不认为我得到了)
  • 有另一个SQLalchemy符号,它包含'sessions'或'base'而不是'数据库模型'

我想要的输出是一个照片id,这样我就可以显示照片及其名称等,也可以显示与照片相关的标签列表,例如逗号分隔的列表。在

我很难找到一个demo/example/tutorial/github项目,它能引导我完成我所需要的工作流。在

有谁能给我展示一个视图的例子,它可以从url参数中获取照片id,然后查询我的模型以获得相关的标记吗?在


Tags: 标记模型视图模板idurldbtags
1条回答
网友
1楼 · 发布于 2024-09-24 22:32:05

从您对用例的描述来看,查询照片而不是photo峎标签似乎更合适。 具有查看功能

@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”关系显示照片并迭代其标记:

^{pr2}$

注意,我在查询照片时使用了get函数。基本上和

Photo.query.filter(id == id).first()

将view函数和模板从phototags重命名为photo也很有意义。在

如果你想显示一个标签的所有图片,你必须颠倒逻辑,查询一个标签并在照片上迭代。应该是可能的,因为您定义了一个backref。在

相关问题 更多 >