Django的get_queryset方法如何同时设置筛选与排序两个条件
解决方法
你重写get_queryset方法时直接返回了自定义的查询集,没有继承ListView内置的排序逻辑,所以类属性里定义的ordering = '-data'不会生效,有两种实现方式可选:
方案1:直接在自定义查询集后追加排序
修改你的views.py里的get_queryset方法,在过滤后加上排序规则:
def get_queryset(self): # 过滤已发布内容,同时按创建时间倒序(最新的在前) return Post.objects.filter(public=True).order_by('-data')
如果需要按创建时间正序排列,把-data的减号去掉改为order_by('data')即可。
方案2:调用父类方法保留内置排序逻辑
如果不想重复写排序规则,也可以调用父类的get_queryset方法,这样你之前定义的ordering类属性会自动生效:
def get_queryset(self): # 先调用父类方法获取默认带排序的查询集,再追加过滤条件 queryset = super().get_queryset() return queryset.filter(public=True)
小提示:注意你模型中创建时间字段命名为
data,和常规的date命名不同,后续开发时注意不要写错字段名导致报错。
内容的提问来源于stack exchange,提问作者Black Black
相关产品推荐
相关产品推荐

