Django实现用户关注股票仅展示每只股票最新5篇文章的方法
实现用户关注股票的最新5篇文章展示方案
我来帮你梳理一下实现这个功能的具体步骤,分模型完善、视图逻辑、模板渲染三个部分来做:
1. 先完善Article模型(关键关联)
首先你需要给Article模型添加和Stock的外键关联,这样才能把文章和对应股票绑定起来,同时加上发布时间字段用于排序取最新内容:
from django.db import models from .models import Stock # 假设Stock在当前app的models里 class Article(models.Model): stock = models.ForeignKey(Stock, on_delete=models.CASCADE, related_name="articles") title = models.CharField(max_length=200) content = models.TextField() publish_date = models.DateTimeField(auto_now_add=True) # 自动记录发布时间 class Meta: ordering = ["-publish_date"] # 默认按发布时间倒序排列,方便取最新文章
2. 视图层处理数据查询(避免性能问题)
在视图里要获取当前登录用户关注的股票,并且高效地预取每只股票的最新5篇文章,这里用Prefetch来优化查询,避免N+1数据库请求:
from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.db.models import Prefetch from .models import Profile, Article @login_required # 确保只有登录用户能访问 def index(request): # 处理新用户无Profile的情况,自动创建 user_profile, created = Profile.objects.get_or_create(user=request.user) # 预取每只关注股票的最新5篇文章,存到latest_articles属性里 followed_stocks = user_profile.followed_stocks.prefetch_related( Prefetch( 'articles', queryset=Article.objects.order_by('-publish_date')[:5], to_attr='latest_articles' ) ) # 将数据传递给模板 return render(request, 'index.html', {'followed_stocks': followed_stocks})
3. 模板index.html渲染内容
在模板里循环遍历每只关注的股票,然后展示对应的最新5篇文章:
{% extends 'base.html' %} <!-- 没有基础模板可以直接去掉这行 --> {% block content %} <h1>我的关注股票最新文章</h1> {% for stock in followed_stocks %} <div class="stock-card"> <h2>{{ stock.name }} ({{ stock.ticker }})</h2> {% if stock.latest_articles %} <ul class="article-list"> {% for article in stock.latest_articles %} <li> <h3>{{ article.title }}</h3> <p>{{ article.content|truncatechars:150 }}</p> <!-- 截断内容显示摘要 --> <small>发布于: {{ article.publish_date|date:"Y-m-d H:i" }}</small> </li> {% endfor %} </ul> {% else %} <p>这只股票暂无相关文章</p> {% endif %} </div> {% empty %} <p>你还没有关注任何股票,快去添加关注吧!</p> {% endfor %} {% endblock %}
额外提示
- 如果你用类视图(比如
ListView),可以在get_queryset方法里实现相同的预取逻辑 - 可以给文章添加更多字段(比如作者、封面图)来丰富展示内容
- 如果文章数量很大,考虑给
publish_date字段加索引,提升排序查询的速度
内容的提问来源于stack exchange,提问作者justin
相关产品推荐
相关产品推荐

