Django中如何在关注用户帖子QuerySet中加入当前用户帖子?
解决方案:把自己的帖子加入关注用户的QuerySet
嘿,这个问题我刚学Django的时候也碰到过!你用append没用是因为get_following()返回的大概率是QuerySet对象,而不是普通的Python列表——QuerySet没有append方法,而且就算强行转列表,这么做也不是最优解。给你两种靠谱的实现方式:
方法1:用Q对象在数据库层面合并查询(推荐)
这种方式直接让数据库帮我们合并“关注用户的帖子”和“自己的帖子”,性能更优,代码也更清晰:
首先要导入Django的Q对象(在文件顶部添加):
from django.db.models import Q
然后修改你的get_queryset方法:
def get_queryset(self, *args, **kwargs): current_user = self.request.user # 获取关注的用户QuerySet following_users = current_user.profile.get_following() # 合并查询条件:关注用户的帖子 OR 自己的帖子 qs = Tweet.objects.filter( Q(user__in=following_users) | Q(user=current_user) ).order_by("-timestamp") return qs
方法2:转成列表后添加自己(适合简单场景)
如果你更习惯用列表操作,也可以把QuerySet转成Python列表,再把当前用户加进去:
def get_queryset(self, *args, **kwargs): current_user = self.request.user # 将关注用户的QuerySet转为列表,再添加当前用户 following_users_list = list(current_user.profile.get_following()) + [current_user] # 过滤出这些用户的帖子 qs = Tweet.objects.filter(user__in=following_users_list).order_by("-timestamp") return qs
小提醒
- 优先选方法1,因为数据库层面的查询比Python层面的列表操作效率更高,尤其是数据量较大的时候。
- 确认
get_following()方法返回的是User模型的QuerySet,如果它返回的是其他类型(比如自定义的Profile QuerySet),你可能需要调整为user__in=following_users.values_list('user', flat=True)之类的写法,不过一般情况下get_following()应该直接返回用户集合。
内容的提问来源于stack exchange,提问作者Maharshi
相关产品推荐
相关产品推荐

