1

我的模型中有一个自定义属性,我想 order_by 使用该属性:

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)

我能不能做得比这更好?

4

2 回答 2

1

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

你可以...

  1. 通过 django 在数据库级别计算extra
  2. 计算数据并在模型保存时将其设置在新列中,然后按此排序。
  3. 使用python排序
于 2013-03-04T19:40:05.590 回答
1

你可以避免lambdawithoperator.itemgetter

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

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

于 2013-03-04T19:40:09.960 回答