【问题标题】:What would be a good way to order by custom property in a django models query set?在 django 模型查询集中按自定义属性排序的好方法是什么?
【发布时间】:2013-03-04 19:35:15
【问题描述】:

我的模型中有一个自定义属性,我想通过使用该属性来订购:

class Report(models.Model):
    title = models.CharField(max_length = 255)
    pub_date = models.DateTimeField('date published', blank=True, null=True)
    status = models.CharField(max_length = 2, choices=REPORT_STATUS)

    @property
    def risk_rating(self):
        # Calculate risk rating here
        return risk_rating

我想做

reports = Report.objects.all().order_by('-risk_rating')

但当然它会返回一个关于不存在列的 mysql 错误。我不希望在使用 python 的排序算法中递归调用这个属性,但这是我认为我可以让它工作的唯一方法。

reports = sorted(Report.objects.all(), key=lambda t: t.risk_rating)

我还能做得更好吗?

【问题讨论】:

  • 为什么不能将计算下推到数据库?或者计算值并将其保存在数据库中?

标签: python django sorting sql-order-by django-queryset


【解决方案1】:

不,ORM使用数据库排序,不能对python值进行操作。

你可以...

  1. 通过 django 的 extra 在数据库级别计算
  2. 计算数据并在模型保存时将其设置在新列中,然后按此排序。
  3. 使用 python 排序

【讨论】:

  • 我想我可能会采用第二种方法,并在每次发布或更新报告时将 risk_rating 值缓存在一个新列中。非常感谢。
【解决方案2】:

你可以用operator.itemgetter避免lambda

import operator
reports = sorted(Report.objects.all(), key=itemgetter(risk_rating))

但我不确定这是否“更好”,也许您可​​以解释一下您希望如何改进查询?

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2022-12-04
    • 2014-07-12
    • 2012-12-20
    • 2013-01-27
    • 1970-01-01
    • 2021-05-22
    • 2010-11-02
    相关资源
    最近更新 更多