Django按isnull值排序?

9
我有一个日期时间字段,可能为空,我想使用qs.order_by('field__isnull', 'name')进行排序,但是结果如下:
Join on field 'field' not permitted. Did you misspell 'isnull' for the lookup type?
这种情况有可能吗?
3个回答

12

也许还有更好的方法,但一个可能的解决方案是对你的查询集进行注释:

from django.db.models import Count
qs.annotate(null_count=Count('field_name')).order_by('null_count')

7

不幸的是,Django没有提供IsNull函数,该函数可用于排序、注释等。(虽然它提供了一个查询查找,但只能用于过滤。)但您可以自己定义该函数:

from django.db.models import BooleanField, Func

class IsNull(Func):
    _output_field = BooleanField()
    arity = 1
    template = '%(expressions)s IS NULL'

现在你可以像这样对查询集进行排序:

qs.order_by(IsNull('field'), 'name')

有趣的问题解决思路! - Andy

-3
我希望你的模型是这样的:
    date_deleted = models.DateTimeField(blank=True, null=True)

如果为True,那么你可以这样做:

qs.order_by('-date_deleted')

这会对非空值进行日期排序,而提问者只想要两个组,即空和非空。 - Rebs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接