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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:20