Django:按外键平均排名进行注释和排序不过滤

Django:按外键平均排名进行注释和排序不过滤,django,django-templates,django-views,Django,Django Templates,Django Views,我有一个广告模型和一个评论模型,由一个Foreignkey('adfk')关联。我试图让他们的评论获得最高平均排名的问题。 例如: AD1-平均排名为4。 AD2-平均排名为5 在模板中,结果应显示AD2第一和AD1第二 在我看来,我正在使用它,但它没有正确显示。DB是postgres。如果我将('-Real')改为('Leal')它显示AD1第一和AD2秒,我的意思是至少考虑Orthy.B/< def adhome(request,tag_wise=None): tags = Tag.

我有一个广告模型和一个评论模型,由一个
Foreignkey('adfk')关联。
我试图让他们的评论获得最高平均排名的问题。 例如: AD1-平均排名为4。 AD2-平均排名为5

在模板中,结果应显示AD2第一和AD1第二

在我看来,我正在使用它,但它没有正确显示。DB是postgres。如果我将<代码>('-Real')改为('Leal')它显示AD1第一和AD2秒,我的意思是至少考虑Orthy.B/<
def adhome(request,tag_wise=None):
    tags = Tag.objects.all()
    cities= advertisement.objects.all().values('city').distinct()
    view = request.GET.get('view')

    if tag_wise:
            questionlist=advertisement.objects.filter(tags__slug__in=[tag_wise])
    else:
            questionlist=advertisement.objects.all()

    if view:
        questionlist = questionlist.filter(city=view)

    questionlist = questionlist.annotate(rating=Avg('adfk__rank')).order_by('-rating')



    paginator = Paginator(questionlist,10) # Show 10 contacts per page
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)
    return render(request,'classified/home.html',{'contacts':contacts,'tag_wise':tag_wise,'view':view,'tags':tags,'cities':cities,})

看起来您想要控制空值和非空值的顺序。 PosgreSQL中存在一个错误。但是,Django不支持它

但您可以执行以下操作:

questionlist = questionlist.annotate(rating=Avg('adfk__rank'))
questionlist = questionlist.extra(
    select={'adfk_is_null': 'adfk_id IS NULL'})
questionlist = questionlist.order_by('adfk_is_null', '-rating')

另一方面,看起来您正在尝试聚合单个值,因此,我建议您使用
F
而不是
Avg

为什么您要按
id
进行订购?@BurhanKhalid我想显示排名最高的广告和最早发布的。删除的id没有任何区别。问题是它首先不显示评级项目,然后再进行订购。您为什么要使用
Avg
?每个广告对象只有一个adfk,并且始终聚合一个值。