Django 使用反向关系按日期订购,同时将“无”值推到末尾

Django 使用反向关系按日期订购,同时将“无”值推到末尾,django,django-queryset,Django,Django Queryset,使用Django 1.7。我在我的网站上使用一个搜索字段,在这里可以搜索任何链接到Person对象的术语 以下是摘录: Person.objects.filter( Q(first_name__icontains=term) | Q(last_name__icontains=term) | ... ).distinct()[:6] 我的模型(简化): 问题:如果多个人的名字相同,我想按最近的评论排序。如果没有对该人员的评论,则该人员应位于结果列表的底部 我试着使用Per

使用Django 1.7。我在我的网站上使用一个搜索字段,在这里可以搜索任何链接到Person对象的术语

以下是摘录:

Person.objects.filter(
    Q(first_name__icontains=term) |
    Q(last_name__icontains=term) |
    ...
).distinct()[:6]
我的模型(简化):

问题:如果多个人的名字相同,我想按最近的评论排序。如果没有对该人员的评论,则该人员应位于结果列表的底部

我试着使用
Person.objects.filter(first\u name\uu icontains=“I”).order\u by('-comment\uu date').distinct()
,这似乎在一定程度上起作用:如果所有
Person
都有
注释,那么这就可以了。
但是,如果一个
没有
注释
s,那么他们将首先显示(在顶部)。 我确实希望它们显示出来,但在列表的底部


如果这不能在一个查询中完成,那么什么是最有效的解决方法?

这将需要一个相当复杂的SQL查询,我认为ORM无法处理。首先尝试创建原始SQL;您可能可以使用
.extra(…)
命令将其插入ORM。以下是我执行类似操作的方式:
news=news.extra(select={'no\u startdate':“CASE WHEN start\u date为NULL,则0 ELSE 1 END”})
@warath coder:我认为只有当我的
类拥有一个到
注释
的外键时,这才有效。至少我得到了
编程错误:列“comment\u id”不存在第1行:选择DISTINCT(如果comment\u id为NULL,则为0 ELS…
(在执行
comment
而不是
comment\u id
时类似)。我想知道Django 1.8的条件表达式是否是解决方法。。。
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    ...

class Comment(models.Model):
    person = models.ForeignKey(Person)
    date = models.DateField(default=datetime.date.today)
    info = models.TextField()