Django订单查询按OnetoOneField设置

Django订单查询按OnetoOneField设置,django,django-queryset,Django,Django Queryset,我有两个模型UserProfile和User。UserProfile模型有一个与用户一起存档的onetoone。我知道了如何通过UserProfile包含的变量对其进行排序。但是,我不知道如何按照相关的用户模型对UserProfile中的项目进行排序 class User(AbstractBaseUser): full_name = models.CharField(max_length=255, blank=True, null=True) class UserProfile(m

我有两个模型UserProfile和User。UserProfile模型有一个与用户一起存档的onetoone。我知道了如何通过UserProfile包含的变量对其进行排序。但是,我不知道如何按照相关的用户模型对UserProfile中的项目进行排序

class User(AbstractBaseUser):
    full_name   = models.CharField(max_length=255, blank=True, null=True)

class UserProfile(models.Model):
    user                = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    lunch_price         = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
我可以很好地运行此查询:

from myapp.models import UserProfiles
print(UserProfile.objects.all().order_by('lunch_price')
我想我应该用全名来订购这样的东西,但它不起作用

from myapp.models import UserProfiles
print(UserProfile.objects.all().order_by('user.full_name')

如何跳转到用户模型?

您可以使用双下划线(
\uuu
)跟踪
OneToOneField
s和其他外键关系。

UserProfile.objects.all().order_by('user__full_name')
UserProfile.objects.all().order\u by('user\u full\u name')
这与Python中通常获取(一连串)属性的方式有点类似。例如,如果
用户
有一个
OneToOneField
到(例如)一个
办公室
模型,那么我们可以使用
User\uu Office\uu loor
进行查询,按照用户办公室所在的
楼层对用户进行排序

请注意,这只适用于处理字段的情况。因此,如果您有一个
用户
类,该类有
名字
姓氏
,并且对
全名
使用
@属性
(换句话说,
全名
是在需要时确定的),那么这将不起作用,您必须在Python级别进行排序。这是合乎逻辑的,因为数据库当然不知道关于Django ORM层的任何信息,因此它无法解释这个属性在做什么