Django中用户关注股票代码统计重复问题求助
解决Django中股票关注量查询重复显示的问题
问题描述
使用查询语句Tickers.objects.annotate(followers=Count('users')).order_by('followers')时,同一股票代码会因多个用户关注而重复显示(例如股票FDCFF有2个关注者却被列出两次),无法正确统计并展示关注量最高的股票。
原因分析
- 多对多关联查询时,若未对用户关联记录做去重处理,可能导致查询结果或计数出现重复
- 排序方向错误:当前使用升序
order_by('followers'),会将关注量最低的股票排在前面,无法直接获取关注量最高的榜首 - 数据库中可能存在重复的股票代码记录(
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
相关产品推荐
相关产品推荐

