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,并且始终聚合一个值。