Django模型按用户点赞点踩排序异常,无票词条排名高于多票词条
问题根源
排序异常的核心是多对多字段关联查询产生笛卡尔积,导致Count统计票数失真:你同时关联了tag_set、userUpVotes、userDownVotes三个多对多表,join后会生成大量重复行,Count统计时会把重复行判定为多次投票,最终得到的票数和实际值完全不符,自然出现排序错乱。
修复方案
1. 修正Count统计逻辑
统计多对多字段数量时,给Count添加distinct=True参数,避免重复行导致的统计错误,同时优化空投票场景的处理逻辑:
defeniciones = Palabra.objects.prefetch_related( 'tag_set', 'userUpVotes', 'userDownVotes' # 提前预加载投票字段避免后续循环产生N+1查询 ).filter( nombre__iexact=palabra, aprobada=True ).annotate( total_upvotes=Count('userUpVotes', distinct=True), total_downvotes=Count('userDownVotes', distinct=True), total_votes=Case( When(total_upvotes + total_downvotes=0, then=None), default=F('total_upvotes') * 1.0 / (F('total_upvotes') + F('total_downvotes')), output_field=FloatField() ) ).order_by(F('total_votes').desc(nulls_last=True), '-total_upvotes')
2. 可选优化评分算法
你当前使用的纯点赞率算法会出现「1赞0踩词条排名高于100赞2踩词条」的不合理情况,如果需要更符合用户预期的排序,可以替换为威尔逊区间评分算法,能平衡投票率和投票样本量,避免低样本词条排名过高。
内容的提问来源于stack exchange,提问作者nadermx
相关产品推荐
相关产品推荐

