You need to enable JavaScript to run this app. Django开发博客按发布时间排序Post时报'function'无order_by属性错误
优惠活动
大模型
产品
解决方案
定价
更多

Django开发博客按发布时间排序Post时报'function'无order_by属性错误

报错原因定位

你遇到的'function' object has no attribute 'order_by'报错完全是get_queryset方法内的链式调用逻辑、括号位置错误导致的,核心问题有两个:

  • 未正确调用timezone.now函数:timezone.now是Django提供的获取当前UTC时间的函数,本身是函数对象,不存在order_by方法。你直接把order_by写到了timezone.now后面,Python解析时会尝试访问函数对象的order_by属性,直接触发报错。
  • 链式调用顺序完全错误:order_by是Django QuerySet的排序方法,应该接在数据筛选逻辑filter()之后,你错误地把order_by塞到了filter()的参数内部,完全不符合QuerySet的链式调用规则。
核心修复方案

调整get_queryset的逻辑:先给timezone.now加括号调用得到当前时间对象,作为filter的筛选参数,再对筛选后的QuerySet调用排序方法即可,正确代码如下:

def get_queryset(self):
    # 筛选发布时间早于等于当前时间的已发布博文,按发布时间倒序排列(新发布的内容优先展示)
    return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')

补充说明:字段名前加-代表倒序排列,不加为升序,上述写法符合博客类网站的常规列表展示逻辑。

顺带修正的代码隐患

你当前的模型定义里还有几处会导致后续运行异常的问题,建议一并调整:

  • Post模型的publish方法:当前写法self.published_date = models.DateTimeField(default=timezone.now)是模型字段的定义语法,不是实例属性赋值的写法,应该改为直接赋值当前时间:self.published_date = timezone.now()
  • Comment模型的create_date字段:你使用DurationField存储创建时间,该字段是用来存储时间间隔(比如时长、有效期差)的,存储具体时间点应该替换为DateTimeField
  • 模型字段的default参数:传可调用对象时只需要写函数名,不需要额外加括号(比如default=timezone.now),Django会在新建实例时自动调用函数生成默认值,手动加括号会导致所有实例共享同一个静态默认值。
  • 视图类命名:当前Postlistview的命名不符合PEP8大驼峰类名规范,建议修改为PostListView,提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 08:15:04