Python 如何按(字段、自定义函数、字段)对Django查询集进行排序

Python 如何按(字段、自定义函数、字段)对Django查询集进行排序,python,django,Python,Django,我正在寻找一个按字段1、函数、字段2排序的查询集 模型: class Task(models.Model): issue_id = models.CharField(max_length=20, unique=True) title = models.CharField(max_length=100) priority_id = models.IntegerField(blank=True, null=True) created_date = models.Dat

我正在寻找一个按字段1、函数、字段2排序的查询集

模型:

class Task(models.Model):
    issue_id = models.CharField(max_length=20, unique=True)
    title = models.CharField(max_length=100)
    priority_id = models.IntegerField(blank=True, null=True)
    created_date = models.DateTimeField(auto_now_add=True)

    def due_date(self):
        ...
        return ageing
我要找的东西是:

taskList = Task.objects.all().order_by('priority_id', ***duedate***, 'title')

显然,不能按自定义函数对查询集进行排序。有什么建议吗?

因为实际的排序是在数据库中进行的,数据库不会讲Python,所以不能使用Python函数进行排序。您需要在SQL表达式中实现到期日逻辑,作为计算字段,如下所示:

due_date_expr = '(implementation of your logic in SQL)'
taskList = Task.objects.all().extra(select={'due_date': due_date_expr}).order_by('priority_id', 'due_date', 'title')
如果您的逻辑太复杂,可能需要在数据库中将其实现为存储过程

或者,如果您的数据集非常小(例如,几十到几百条记录),您可以在列表中获取整个结果集,并在事后对其进行排序:

taskList = list(Task.objects.all())
taskList.sort(cmp=comparison_function) // or .sort(key=key_function)

由于实际排序是在数据库中进行的,而数据库不会讲Python,因此不能使用Python函数进行排序。您需要在SQL表达式中实现到期日逻辑,作为计算字段,如下所示:

due_date_expr = '(implementation of your logic in SQL)'
taskList = Task.objects.all().extra(select={'due_date': due_date_expr}).order_by('priority_id', 'due_date', 'title')
如果您的逻辑太复杂,可能需要在数据库中将其实现为存储过程

或者,如果您的数据集非常小(例如,几十到几百条记录),您可以在列表中获取整个结果集,并在事后对其进行排序:

taskList = list(Task.objects.all())
taskList.sort(cmp=comparison_function) // or .sort(key=key_function)

如果查询集不太大,可以在Python中使用排序:

ordered = sorted(Task.objects.all(), key=lambda o: (o.priority_id, o.due_date(), o.title))

如果查询集不太大,可以在Python中使用排序:

ordered = sorted(Task.objects.all(), key=lambda o: (o.priority_id, o.due_date(), o.title))

@lanzz给出的答案,尽管看起来是正确的,但对我来说并不适用,但另一条线索给出的答案给我带来了魔力:


@lanzz给出的答案,尽管看起来是正确的,但对我来说并不适用,但另一条线索给出的答案给我带来了魔力:


谢谢你的回答。但是这不会成为一个没有优先权的订单吗?谢谢你的回答。但是这不会成为一个没有优先权的订单吗?答案很好。所以应该在SQL端或Python端处理它。回答不错。因此,应该在SQL端或Python端处理它。