Django遍历Post实例列表时出现TypeError:'<' not supported between instances of 'Post' and 'Post' 的问题求助
解决 'Post' 实例间不支持 '<' 比较的 TypeError 错误
这个报错的根源很明确:当你调用 sorted(chain(*pposts), reverse=True) 时,Python 默认会尝试用小于号(<)来比较 Post 实例,但你的 Post 模型并没有定义实例之间的比较逻辑,所以抛出了这个类型错误。
下面给你两种直接的修复方案,以及代码优化建议:
方案一:给 sorted() 指定排序的 key 参数(推荐)
既然你的 Post 模型已经在 Meta 类里指定了按 -date_added 排序,那我们可以直接用这个字段作为 sorted 的排序依据,这样就不用修改模型代码:
修改 views.py 里的排序代码:
if len(pposts) > 0: # 用date_added作为排序key,实现按时间倒序 qs = sorted(chain(*pposts), key=lambda post: post.date_added, reverse=True)
方案二:在 Post 模型中定义比较方法
如果你希望 Post 实例本身支持比较操作,可以在 models.py 的 Post 类中添加 __lt__ 方法(定义“小于”的逻辑):
class Post(models.Model): # ... 其他字段和方法 ... def __lt__(self, other): # 定义:当self的date_added早于other时,self < other return self.date_added < other.date_added
添加这个方法后,sorted 就能正常比较 Post 实例了,原来的 sorted(chain(*pposts), reverse=True) 代码可以保留不变。
额外的代码优化建议
你的 frontpage 视图里获取关注用户的帖子的方式效率很低,循环查询每个用户的 Profile 会产生大量数据库查询。可以改成用 QuerySet 的批量查询来优化:
def frontpage(request, *args, **kwargs): profile = Profile.objects.get(user=request.user) # 获取所有关注的用户 followed_users = profile.following.all() # 直接批量获取这些用户的Profile对应的所有Post pposts = Post.objects.filter(author__user__in=followed_users) # 获取自己的帖子 mposts = profile.profiles_posts() # 合并两个QuerySet并按date_added倒序(这里可以直接用QuerySet的order_by,比sorted更高效) qs = pposts.union(mposts).order_by('-date_added') return render(request, 'posts/frontpage.html', {'posts': qs, 'pposts': qs })
这样不仅避免了循环查询,还利用了 Django QuerySet 的优化,性能会好很多,而且也不需要用 chain 和 sorted 了,从根源上避免了实例比较的问题。
内容的提问来源于stack exchange,提问作者7mood
相关产品推荐
相关产品推荐

