首页 > 解决方案 > 使用 django 中的标题按字母顺序对 db 进行排序

问题描述

在 django 上编写网站:

我在数据库中有 1500 行

需要将这些行提供给前端,例如:

A Alice Andrew Ann B Bill Boris Brendan ...

现在在我的views.py中,for循环围绕名称,如果名称的第一个字母在字母表中,则该字母将添加到我的新字母表中:

for name in names:
  if name[0] in alphabet:
    my_alphabet.append(name[0])
my_alphabet = sorted(list(set(my_alphabet)))

然后我将我的新字母和名称转移到 html 模板:

{% for letter in my_alphabet %}
  <span>{{ letter }}</span>
  {% for name in names %}
    {% if name.0 == letter %}
      <span>{{ name }}</span>
    {% endif %}
  {% endfor %}
{% endfor %}

该页面加载时间长达 10 秒

也许有人有更快的变种?

感谢帮助菜鸟,抱歉浪费时间!

标签: pythonhtmldjango

解决方案


内置模板标签regroup可用于循环列表/查询集并按公共属性分组。

from django.db.models.functions import Substr
objects = MyModel.objects.order_by('name').annotate(
    first_letter=Substr('name', 1, 1)
)

上面的查询集给出了MyModel用名称字段的第一个字母注释的所有实例。然后您可以在regroup标签中使用它

{% regroup objects by first_letter as letters %}

{% for letter in letters %}
  <span>{{ letter.grouper }}</span>
  {% for object in letter.list %}
      <span>{{ object.name }}</span>
  {% endfor %}
{% endfor %}

推荐阅读