【问题标题】:Flask SQLalchemy - many to many - show photo with all tags (or blog with all posts etc)Flask SQLalchemy - 多对多 - 显示带有所有标签的照片(或带有所有帖子等的博客)
【发布时间】:2015-07-12 07:01:47
【问题描述】:

我是 Flask 和 SQLalchemy 的新手。想要有一张带有单独照片的网页,显示分配给该照片的所有标签。

我的 SQLalchemy 可以在 MYSQL 数据库中正常工作。很好地检索记录等。

我需要有关烧瓶/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 %}

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

该模板并不完美,因为它目前似乎显示照片 ID 的标签 ID。我试过做'phototag.photo_id'或'phototag.filename'但没有出来。显然视图查询并没有通过。

所以视图是我需要帮助的。查询是否正确?是否正确获取了 photo_id 的 url 传递参数?

我的测试数据很简单。我有一个带有 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 也得到相同的两个标签。所以查询显然是不正确的。

我查看了许多示例,它们都与我想要的略有不同。我见过的示例/教程/SO问题/答案都没有显示模型、视图和模板如何协同工作以获得我想要的。它们是:

  • 得到相反的结果,例如按标签相当于照片(希望按照片标签)
  • 只是通过照片获取标签的查询(我什至不认为我明白了)
  • 有另一个 SQLalchemy 表示法,其中包括“会话”或“基础”而不是“db.model”

我想要输出的是照片 ID,因此我可以显示照片及其名称等,还可以显示与该照片关联的标签列表,例如逗号分隔列表。

我很难找到一个演示/示例/教程/github 项目来引导我完成工作流程所需的内容。

谁能告诉我可以从 url 参数获取照片 id 然后查询我的模型以获取关联标签的视图示例?

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    从您描述的用例中查询照片而不是 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 模板中的“标签”关系迭代其标签:

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

    【讨论】:

    • 啊,好吧,这太容易了。这就是照片模型中标签关联(和反向引用)的使用方式。我不会想到使用“photo.tags”,因为我不知道该关联可以通过标签关联访问 photo_tags 表。现在完全有道理。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2020-12-27
    • 2019-08-10
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多