You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中用户关注股票代码统计重复问题求助

解决Django中股票关注量查询重复显示的问题

问题描述

使用查询语句Tickers.objects.annotate(followers=Count('users')).order_by('followers')时,同一股票代码会因多个用户关注而重复显示(例如股票FDCFF有2个关注者却被列出两次),无法正确统计并展示关注量最高的股票。

原因分析

  1. 多对多关联查询时,若未对用户关联记录做去重处理,可能导致查询结果或计数出现重复
  2. 排序方向错误:当前使用升序order_by('followers'),会将关注量最低的股票排在前面,无法直接获取关注量最高的榜首
  3. 数据库中可能存在重复的股票代码记录(symbol字段未设置唯一约束)

解决方案

1. 修正查询语句,确保正确计数并排序

修改views.py中的查询逻辑,在Count中添加distinct=True避免重复计数,同时改为降序排序,让关注量最高的股票排在最前面:

def index(request):
    tickers = Tickers.objects.annotate(followers=Count('users', distinct=True)).order_by('-followers')
    context = {
        'tickers': tickers,
    }
    return render(request, 'main_index.html', context=context)

2. 优化模型,从根源避免重复记录

在Models.py中给symbol字段添加唯一约束,防止同一股票代码被多次创建:

class Tickers(models.Model):
    symbol = models.CharField(max_length=100, unique=True)  # 添加唯一约束
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(User, related_name='tickers')

3. 模板优化(可选)

可以在模板中添加关注量显示,方便直观验证结果,当前循环逻辑无需修改:

{% for ticker in tickers|slice:'10' %}
        <tr>
          <td class=''>
            <a href="{% url 'Symbol:index' ticker=ticker.symbol %}">{{ticker.symbol}}</a>
            <span>{{ticker.name}}</span>
          </td>
          <td>{{ticker.followers}}</td> <!-- 新增:显示该股票的关注人数 -->
        </tr>
{% endfor %}

关键说明

  • Count('users', distinct=True):确保每个用户仅被计数一次,避免因异常重复关联导致的计数错误
  • order_by('-followers'):降序排列后,关注量最高的股票会出现在查询集的首位
  • unique=True:从数据库层面杜绝重复股票代码,彻底解决重复显示的根源问题

内容的提问来源于stack exchange,提问作者Ahmed B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:15:59