【问题标题】:Is there a way to use order_by in Django to specify the order in which the results are returned?有没有办法在 Django 中使用 order_by 来指定返回结果的顺序?
【发布时间】:2021-03-25 16:16:13
【问题描述】:

到目前为止,我只看到 order_by 的升序和降序用法。我想要 order_by(Risk) 但结果以高、中、低顺序返回(这些是我在该字段中的选项),而不是基于字母排序,order_by 默认完成的方式。

换一种方式来解释...我的模型中有一个名为“风险”的字段。风险在所有记录中只有 3 个值,高、中、低。当我在数据库上运行查询时,我希望它根据字段 Risk 按 High、Med、Low 的顺序对查询结果进行排序,而不是它现在返回记录的随机顺序。

当前代码如下所示:

    items = ScanData.objects.filter(Q(Owner__icontains="HooliCorp")).order_by(Risk)

【问题讨论】:

  • 我不清楚您的目标是什么。您能否分享相关模型并使用示例输入/输出来明确您的目标是什么?
  • 保存 High/Med/Low 似乎效率低下,将这些值保存为易于排序的整数,并通过 choicesdocs.djangoproject.com/en/3.1/ref/models/fields/#choices 将 High/Med/Low 映射到整数跨度>
  • @yedpodtrzitko - 我正在处理数千条记录,我上传到数据库的 .csv 文件以字符串 High/Med/Low 格式输出风险字段。我试图避免将其更改为基于数字的系统。
  • @errMSG 如果您正在处理“数千条记录”,您应该担心的问题不是在执行一次性 DB INSERT 时转换数据,而是在执行时您将拥有的性能每个 SELECT 上的非最佳查询。不过祝你好运。

标签: python django django-views


【解决方案1】:

一种解决方案是使用一些条件语句来注释您的查询,该语句将根据字段值输出一个数字:

items = ScanData.objects.filter(
    Q(Owner__icontains="HooliCorp")
).annotate(
    risk_order=models.Case(
        models.When(Risk='Low', then=1),
        models.When(Risk='Med', then=2),
        models.When(Risk='High', then=3),
        output_field=models.IntegerField(),
    ),
).order_by('risk_order')

这将在结果列表上创建一个注释,其编号为 1 到 3,具体取决于风险值,然后它将按此注释对查询进行排序。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 2015-07-17
    • 1970-01-01
    • 2016-04-26
    • 2021-09-29
    • 2017-11-29
    • 2015-07-19
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多