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

在Django开发中如何实现获取用户已关注话题的功能?

在Django中获取用户关注的话题的方法

嘿,我看你正在开发一款支持用户关注话题的应用,先帮你把Follow模型补全一下(你代码里的user字段没写完),完整的模型应该是这样的:

from django.contrib.auth.models import User
from django.db import models

class Topic(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=300)
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name='topics_created')
    def __str__(self):
        return self.name

class Follow(models.Model):
    topic = models.ForeignKey(Topic, related_name='followers')
    user = models.ForeignKey(User, related_name='followed_topics')
    # 建议加上这个字段,记录用户关注时间
    followed_on = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        # 确保一个用户不能重复关注同一个话题
        unique_together = ('user', 'topic')

接下来给你几种获取用户关注话题的常用方法:

方法一:通过User实例的反向关联直接获取

因为我们给Follow模型的user字段设置了related_name='followed_topics',所以可以直接从User实例出发,通过反向关联快速获取关注的话题:

# 假设你已经拿到了当前用户实例,比如request.user
current_user = request.user

# 获取该用户关注的所有话题对象列表(最简洁的写法)
followed_topics = Topic.objects.filter(followers__user=current_user)

# 或者通过User的反向关联直接获取关联的话题
followed_topics = current_user.followed_topics.values_list('topic', flat=True)

方法二:通过Follow模型过滤查询

如果你需要先获取关注记录再关联话题,或者要用到关注时间这类额外字段,可以这样做:

# 获取当前用户的所有关注记录
follow_records = Follow.objects.filter(user=current_user)
# 从记录中提取对应的话题对象
followed_topics = [record.topic for record in follow_records]

# 更高效的单查询写法
followed_topics = Topic.objects.filter(follow__user=current_user)

方法三:优化性能的查询方式

如果要在模板中展示话题的详细信息(比如话题创建者),建议用prefetch_related减少数据库查询次数,提升页面加载速度:

# 获取用户关注的话题,同时预加载话题的创建者信息
followed_topics = Topic.objects.filter(follow__user=current_user).prefetch_related('created_by')

这样在遍历话题列表时,访问topic.created_by就不会每次都触发新的数据库查询啦。

内容的提问来源于stack exchange,提问作者vinoth kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:39