对于这种情况,我想按升序排序QuerySet
:
PRIORITY_CHOICES = (
(1, "P1"),
(2, "P2"),
(3, "P3"),
(4, "P4"),
(5, "P5"),
)
class Task(models.Model):
name = models.CharField(max_length=255)
priority = models.PositiveIntegerField(choices=PRIORITY_CHOICES)
现在,因为优先级可以接受None值。问题是在我的View代码中执行此操作时对Query集进行排序:
task_list = Task.objects.all().order_by("priority")
这将返回查询集,其中对象按优先级的升序排列,首先是None值。我想要升序列表,但我想在最后包含None值。我有一个庞大的数据库,所以,我有兴趣在数据库级别完成这个。
答案 0 :(得分:1)
您可以使用queryset.order_by('-field')
(前缀“ - ”符号)将顺序更改为降序,但Django无法告诉应如何对空值进行排序 - 这是数据库特定的行为。如果使用降序排序仍然在数据库中首先提供空值 - 请使用queryset.extra(select={'order': 'custom_sql_function(priority)'}).order_by('order')
,其中custom_sql_function
将字段转换为整数(如果它为空),并且特定于数据库引擎。
为了提高性能,您可以在function(field)
上创建db索引。