【问题标题】:Fetch list of objects with distinct() in django在 django 中获取具有 distinct() 的对象列表
【发布时间】:2012-08-03 12:11:02
【问题描述】:

我有一个带有图片库标签的数据库。它们包含字段“id”、“picture_id”和“tag”。我正在尝试构建所有标签的列表,但没有两次列出相同的标签。我知道我可以在查询集中使用 distinct() 来做,但是将它与 all() 一起使用只会抛出一个错误,告诉我后端数据库不支持它。 (我正在使用 MySQL)。

如果我使用 values_list('id','tag') 我不会收到该错误。实际上,我根本没有收到任何错误。但是我也没有得到任何可以在我的模板中打印出来的东西。

查询集是这样写的:

tags = Tag.objects.values_list('id', 'tag').distinct().order_by('tag')

在模板中,我可以尝试打印:

{% for tag in tags %}
    <p>{{ tag.id }}: {{ tag.tag }}</p>
{% endfor %}

这给了我一长串“:”符号,但它的右侧或左侧没有。这向我表明我的列表中有东西,但我似乎无法使用它。我做错了什么?

编辑:值得注意的是,我尝试在 Shell 中做这些事情,当在那里打印标签时,我得到一个看似由 id 和标签组成的对象列表,但我似乎仍然无法将其输出模板。

【问题讨论】:

    标签: django distinct


    【解决方案1】:

    values_list 将创建一个元组列表,而不是字典,因此使用字典表示法将不起作用。 Check out the the docs:

    ... 它不是返回字典列表,而是返回元组列表。每个元组都包含传递给 values_list() 调用的各个字段的值——所以第一项是第一个字段,等等。例如:

    >> Entry.objects.values_list('id', 'headline')
    [(1, u'First entry'), ...]
    

    所以,你应该这样做:

    {% for tag in tags %}
        <p>{{ tag.0 }}: {{ tag.1 }}</p>
    {% endfor %}
    

    【讨论】:

    • 这解决了我看不到帖子的问题,谢谢!我会在可能的情况下(6 分钟)将其标记为已接受的答案,但我似乎仍然不能既使用 distinct 来清除独特的标签,也不能拥有和使用“id”。您是否知道这样做的方法,或者是在将其发送到模板之前在 views.py 中手动创建列表或其他内容的唯一方法?
    • 你打电话给distinct()还是distinct('tag')?后者可能由于错误而导致错误:code.djangoproject.com/ticket/17974
    • 我知道使用 distinct('tag') 会出现错误。我认为问题在于拥有 values_list('id','tag') 然后执行 distinct() 可能会查看 id 和 tag 的唯一组合,当然它们总是唯一的。
    • 我的一个朋友对我的问题做了一个聪明的评论:“如果你需要这个功能,那么你有一个“糟糕的”数据库结构。”经过一番思考,我发现他是对的。问题解决了。无论如何谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 2018-06-26
    • 2020-11-06
    • 2015-03-24
    • 2017-12-17
    • 2018-12-01
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多