如何按父模型属性对Django的Profile查询集进行排序?
解决Profile查询集按关联User模型字段排序的问题
这问题我之前也碰到过,其实核心原因很简单:date_joined是Django内置User模型的字段,你的Profile模型本身并没有这个字段,直接在Profile的查询集里用它自然会报错。要实现按关联User的字段排序,你需要用**双下划线__**来跨模型访问关联字段。
正确的查询代码
把你的排序语句改成这样:
queryset = Profile.objects.all().order_by('-user__date_joined')
这里的user__date_joined表示:通过Profile模型的user外键字段,访问关联User模型的date_joined字段。前面的-表示按倒序排列(最新加入的在前),如果要正序去掉-即可。
扩展说明
这种双下划线的用法在Django ORM里非常常用,除了排序,你还可以用它来做过滤、筛选等操作,比如:
- 筛选出用户注册时间在某个日期之后的Profile:
from django.utils import timezone one_month_ago = timezone.now() - timezone.timedelta(days=30) queryset = Profile.objects.filter(user__date_joined__gte=one_month_ago) - 按User的用户名排序:
queryset = Profile.objects.all().order_by('user__username')
小提示
另外注意到你的Profile模型的__str__方法里写了return self.get_username(),这会报错哦,因为Profile类没有这个方法,应该改成return self.user.username来获取关联用户的用户名。
内容的提问来源于stack exchange,提问作者sadmansh
相关产品推荐
相关产品推荐

