在django中使用distinct()和filter()

Ahm*_*gdi 0 python django

我正在尝试在 Django 中创建一个查询,该查询调用distinct满足过滤器某些条件(使用)的唯一行(使用filter

\n\n

这是使用的文件:

\n\n

视图.py

\n\n
def cat_details(request, pk):\n    current_user = request.user\n    selected_cat = get_object_or_404(Category, pk=pk)\n    selected_items = ItemIn.objects.all().filter(item_category=selected_cat).values_list(\'item_name\', flat=True).distinct()\n    all_cats = Category.objects.all()\n    cat_count = all_cats.count()\n    item_count = ItemIn.objects.values_list(\'item_name\', flat=True).distinct().count()  # returns a list of tuples..\n    #all_units = Item.objects.aggregate(Sum(\'item_quantity\'))[\'item_quantity__sum\']\n    context = {\n        #\'all_units\': all_units,\n        \'item_count\': item_count,\n        \'cat_count\': cat_count,\n        \'selected_items\': selected_items,\n        \'selected_cat\': selected_cat,\n        \'current_user\': current_user,\n    }\n\n    return render(request, \'townoftech_warehouse/cat_details.html\', context)\n
Run Code Online (Sandbox Code Playgroud)\n\n

调用的变量selected_items就是问题所在!

\n\n

这是我如何使用这个视图函数

\n\n

超文本标记语言

\n\n
{% extends \'townoftech_warehouse/base.html\' %}\n    {% block content %}\n{% load static %}\n        <div class="card">\n  <div class="card-header">\n    \xd8\xa7\xd9\x84\xd8\xa7\xd8\xb5\xd9\x86\xd8\xa7\xd9\x81 \xd9\x81\xd9\x89 \xd8\xa7\xd9\x84\xd9\x85\xd8\xae\xd8\xb2\xd9\x86\n  </div>\n  <div class="card-body">\n      <h3 align="right"> {{ selected_cat }}</h3>\n      <footer><a href="{% url \'edit_cat\' selected_cat.pk%}"><button type="button" class="btn btn-dark">\xd8\xaa\xd8\xb9\xd8\xaf\xd9\x8a\xd9\x84 \xd8\xa5\xd8\xb3\xd9\x85 \xd8\xa7\xd9\x84\xd9\x81\xd8\xa6\xd8\xa9</button></a>\n     <a href="{% url \'category_delete\' selected_cat.pk%}"><button type="button" class="btn btn-dark">\xd9\x85\xd8\xb3\xd8\xad \xd8\xa7\xd9\x84\xd9\x81\xd8\xa6\xd8\xa9</button></a>\n</footer>\n  </div>\n</div>\n                  <div style="overflow: auto;height: 280px">\n\n        <table class="table table-bordered">\n\n  <tbody>\n  {% for item in selected_items %}\n    <tr align="right">\n        <th scope="row"><a href = "{% url \'items\' item.pk%}">{{ item.item_name }}</a></th>\n    </tr>\n  {% endfor %}\n  </tbody>\n</table>\n                  </div>\n        <br>\n        <br>\n<div align="right"><a href="{% url \'cat\' %}"><button type="button" class="btn btn-danger">\xd8\xb1\xd8\xac\xd9\x88\xd8\xb9</button></a></div>\n\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

每当我尝试打开此页面时,我收到的错误是:

\n\n

错误

\n\n
NoReverseMatch at /category/15/\nReverse for \'items\' with arguments \'(\'\',)\' not found. 1 pattern(s) tried: [\'item\\\\/(?P<pk>[0-9]+)\\\\/$\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

我已从 HTML 文件中删除了链接

\n\n

改变了

\n\n

{% for selected_items % 中的项目}\n \n {{ item.item_name }}\n \n {% endfor %}

\n\n

像是

\n\n
  {% for item in selected_items %}\n    <tr align="right">\n        <th scope="row">{{ item.item_name }}</th>\n    </tr>\n  {% endfor %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误消失了,但它现在给了我一个空值列表!

\n

nev*_*ner 12

selected_items变量包含字符串对象列表(项目名称)。字符串没有pk属性,因此item.pk在模板中不返回任何内容。

相反,values_list您需要传递到对象模板列表。如果您使用的是 postgres,则可以使用distinct()with 参数。

selected_items = ItemIn.objects.all().filter(item_category=selected_cat).distinct('item_name')
Run Code Online (Sandbox Code Playgroud)

否则你可以尝试values使用'item_name', 'pk'

selected_items = ItemIn.objects.all().filter(item_category=selected_cat).values('item_name', 'pk').distinct()
Run Code Online (Sandbox Code Playgroud)

  • @AhmedWagdi 是的,在这种情况下,“distinct”适用于这两个领域。所以你最好转向Postgres,无论如何SQlite对于生产来说不是一个好的选择,检查这个问题:/sf/ask/483968341/ (2认同)