2014-02-20 75 views
0

我在寻找获取按field1,function,field2排序的QuerySet。如何按(字段,自定义函数,字段)对Django QuerySet进行排序

型号:

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') 

很显然,你不能排序自定义函数一个查询集。有任何建议吗?

回答

2

由于实际的排序发生在数据库中,它不会说Python,所以您不能使用Python函数进行排序。您将需要执行一个SQL表达式到期日的逻辑,作为Queryset.extra(select={...})计算领域,东西线沿线的:

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) 
+0

不错的答案。所以它应该在SQL端或Python端处理。 – killua8p

0

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

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

感谢您的答案。但是这不会成为order_by(duedate,title) - 没有priority_id? – killua8p

+0

好点。我纠正了我的答案。 – arocks

相关问题