Django中按注解字段due_date排序报错:无法解析字段的原因?
Django注解字段无法排序的原因及修复方案
问题根源
Django的QuerySet是不可变对象,调用annotate()方法不会修改原QuerySet实例,而是返回一个包含新注解的全新QuerySet。你的代码里直接调用self.annotate()后返回原self,导致注解根本没被应用到最终的QuerySet上,自然在排序时找不到due_date字段。
修复代码
修改方法,直接返回annotate()生成的新QuerySet即可:
def with_due_date(self: _QS): return self.annotate( due_date=models.Case( *[ models.When( FKMODEL__field=field, then=models.F('created_at') - timedelta(days=days) ) for field, days in due_date_mapping.items() ], output_field=models.DateTimeField(), ), )
注意事项
- Django所有QuerySet链式方法(
filter()、annotate()、order_by()等)都返回新实例,不会修改原对象,这是为了保证QuerySet的可复用性和线程安全。 - 调用顺序不能错:必须先调用
with_due_date()添加注解,再调用order_by('due_date'),比如:# 正确示例 qs = MyModel.objects.all().with_due_date().order_by('due_date')
内容的提问来源于stack exchange,提问作者Robertas
相关产品推荐
相关产品推荐

