python - 以任意顺序对查询集进行排序

标签 python django

我有这样一个模板来呈现来自数据库的 block

<div class="panel panel-default">
  <div class="panel-heading">
    <a style='font-size:18pt' href="article/list/{{ b.id }}">{{ b.name }}</a>
    <span class='pull-right'>{{ b.admin }}</span>
  </div>
  <div class="panel-body">
    {{ b.desc }}
  </div>
</div>

数据模型:

class Block(models.Model):
    STATUS = (
        (1,  'normal'),
        (0, 'deleted'),
    )
    name = models.CharField("block name", max_length=100)
    desc = models.CharField("block description", max_length=100)
    admin = models.CharField("block admin", max_length=100)
    status = models.IntegerField(choices=STATUS)

    class Meta:
        ordering = ("id",)

    def __str__(self):
        return self.name   

我检索数据为

In [2]: from article.models import Block
In [3]: blocks = Block.objects.all()
In [4]: blocks
Out[4]: <QuerySet [<Block: Concepts>, <Block: Reading>, <Block: Coding>, <Block: Action>]>

我想以 ['concept','code', 'read', 'action'] 的任意顺序呈现数据,而不是按 id,

通过观察,我发现这可以通过命令它的第二个字母来实现,

In [7]: sorted(l, key=lambda item: item[1], reverse=True)
Out[7]: ['concept', 'code', 'read', 'action']

如何以这种方式对查询集进行排序?

最佳答案

您可以先注释每个 Block实例,然后按使用 Substr function [Django-doc] 的注释排序,比如:

from django.db.models.functions import <b>Substr</b>

Block.objects.annotate(
    sndchar=<b>Substr('name', 2, 1)</b>
).order_by(<b>'-sndchar'</b>)

作为额外奖励每Block实例将有一个 sndchar name 的第二个字符属性属性(仅在此查询集中)。但我认为这不是真正的问题。如果它与另一列冲突,您可以重命名它。

<b>-</b>sndchar 中的减号字符意味着我们将按降序排序。如果你想按升序排序,你可以删除它。

因此这里的排序是在数据库级别完成的,这通常(显着)快于在 Django 级别执行此操作。

您还可以从第二个字符开始对字符串进行排序(这样在平局的情况下,第三个字符等被考虑在内),通过删除 length参数,因此用除第一个字符之外的名称进行注释:

from django.db.models.functions import Substr

# This will sort on the third character in case of a tie, and so on
Block.objects.annotate(
    sndchar=<b>Substr('name', 2)</b>
).order_by('-sndchar')

关于python - 以任意顺序对查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290053/

相关文章:

python - 将多个列表合并到 1 个列表中

python - 使用 pandas 获取聚合行值的样本

MySQL 拒绝在 Ubuntu 中使用 Django

python - Django 按最新评分列出所有作者

django - 运行 `django-admin makemessages` 时如何忽略 Django 的 .po 文件中已翻译的字符串

python - 使用Sphinx使用:glob:生成Python文档

javascript - 如何将 getAccessToken 与 fetch 功能集成,以将数据从 DRF 后端加载到 React 前端?

python - 如何计算数组python中连续出现了多少次值?

python - Django 管理设置

python - 如何以编程方式上传本地文件作为 Django 模型字段?