如何在Django中通过关联User模型字段排序UserProfile查询集?
如何通过关联的User模型字段对UserProfile查询集排序?
嘿,这个问题其实是Django ORM里跨关联模型排序的常见小坑,我来给你讲清楚怎么解决:
首先,你之前用user.full_name的写法不对——Django的ORM不支持用点号.来跨关联模型访问字段,而是要用**双下划线__**来关联跨模型的字段。
正确的排序写法
把你的代码改成这样就行:
from myapp.models import UserProfile # 注意这里你之前写的UserProfiles是复数,应该是单数UserProfile哦 print(UserProfile.objects.all().order_by('user__full_name'))
额外的实用小技巧
- 倒序排序:如果想按
full_name降序排列,只需要在字段前加-:UserProfile.objects.all().order_by('-user__full_name') - 处理空值排序:因为你的
full_name字段设了blank=True, null=True,在Django 3.2及以上版本可以用nulls_first或nulls_last来控制空值的排序位置:# 让空的full_name排在结果最前面 UserProfile.objects.all().order_by('user__full_name').nulls_first() # 让空的full_name排在结果最后面 UserProfile.objects.all().order_by('user__full_name').nulls_last()
为什么原来的写法不行?
Django ORM的order_by方法里,跨关联模型的字段必须用双下划线分隔,这是ORM约定的语法,用来表示“沿着外键/一对一关联访问关联模型的字段”。你之前用的点号是Python里访问对象属性的语法,但ORM查询的参数需要遵循它自己的规则~
内容的提问来源于stack exchange,提问作者Micah Pearce
相关产品推荐
相关产品推荐

