Django技术问题:无法反转Queryset,查询集排序无变化
解决Django QuerySet排序不生效的问题
嘿,我来帮你搞定这个排序的问题!你试过了好几种反转/排序的写法,但结果都没变化,大概率是因为你的Post对象的date字段值都相同,或者是字段类型的局限,让我一步步给你分析:
首先排查核心问题:你的date字段是不是都一样?
看你的模型里date是DateField(auto_now_add=True),这意味着每个Post创建时只会记录日期,不会记录具体的时分秒。如果你的测试数据都是同一天创建的,那所有Post的date值完全一样!这时候不管你用order_by('-date')还是reverse(),Django都会用默认的主键(id)作为二次排序依据,所以你看到的顺序自然不会有变化。
你可以打开Django Shell验证一下:
python manage.py shell
然后输入:
from yourapp.models import Post Post.objects.values('id', 'date')
看看输出里的date是不是全相同,如果是,那这就是问题根源!
解决方案
方案1:把date改成DateTimeField(推荐)
如果需要按创建的先后顺序(精确到时间)排序,直接把模型里的字段改成DateTimeField,这样auto_now_add=True会记录创建的完整时间(包括时分秒):
# models.py class Post(models.Model): title = models.CharField(max_length=100, unique=True, blank=True, null=True) image = models.URLField(blank=True, null=True, unique=True) content = models.TextField(blank=True, null=True) date = models.DateTimeField(auto_now=False, auto_now_add=True) # 修改这里 def __str__(self): return self.title
然后运行迁移:
python manage.py makemigrations python manage.py migrate
之后你的视图用order_by('-date')就能正常按创建时间倒序排列了:
def home(request): posts = Post.objects.order_by('-date') return render(request, "home.html", {'posts': posts})
方案2:按主键倒序排序(不用改模型)
如果不想修改模型,直接用主键倒序也能实现“最新创建的在前”的效果,因为Django的主键默认是自增的:
def home(request): posts = Post.objects.order_by('-id') return render(request, "home.html", {'posts': posts})
额外注意:清缓存
如果以上方法都试了还是没变化,检查一下:
- 视图有没有用
@cache_page之类的缓存装饰器?如果有,暂时注释掉或者清理缓存 - 浏览器有没有缓存页面?可以用
Ctrl+F5强制刷新页面
内容的提问来源于stack exchange,提问作者Andrew McNoodles
相关产品推荐
相关产品推荐

