Python 在django models查询集中按自定义属性排序的好方法是什么?

Python 在django models查询集中按自定义属性排序的好方法是什么?,python,django,sorting,sql-order-by,django-queryset,Python,Django,Sorting,Sql Order By,Django Queryset,我的模型中有一个自定义属性,我想使用该属性订购_: 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)

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

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)

我能做得更好吗?

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

你可以

  • 通过django的
    extra
  • 计算数据并在模型保存时将其设置在新列中,然后按该列排序
  • 使用python排序

  • 您可以使用
    操作符避免
    lambda
    。itemgetter

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

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

    为什么不能将计算向下推到数据库?或者计算值并保存在数据库中?我想我可以采用第二种方法,在每次发布或更新报告时,将风险评级值缓存在一个新列中。多谢。