繁体   English   中英

如何在 django 中使用 related_name 对查询集进行排序

[英]How to order a queryset using related_name in django

我有一个用户 model,它使用 related_name='driver' 与 DriverCar model 相关。 每个用户可能与多个司机相关。 DriverCar model 有一个类型为 integer 的字段“ reference_number ”。我想显示按与用户相关的最后一个 DriverCar object 的reference_number排序的所有用户的列表。 使用像User.objects.filter(archive=False).order_by('-driver__reference_number')这样的查询给了我错误的答案。 但是,如果我使用order_by('-pk')一切正常。 有什么办法可以正确地做到这一点?

class User(AbstractUser):
    archive = models.BooleanField(default=False)

class DriverCar(models.Model):
    user = models.ForeignKey(User , on_delete=models.CASCADE , related_name='driver')
    reference_number = models.BigIntegerField(default=0, null=True, blank=True)

这将结合其他问题的几个现有答案......

您将需要一个子查询来获取“与用户相关的最后一个 DriverCar object”的reference_number的值。

参见https://stackoverflow.com/a/60217311/202168

我假设“最后”可能意味着“最高 pk”(DriverCar)

所以子查询看起来像:

subquery = (
    Subquery(
        DriverCar.objects.filter(user_id=OuterRef("id")
    )
    .order_by("-pk")
    .values('reference_number')[:1]
)

我们可以使用子查询中的值来注释我们的用户查询集,例如:

User.objects.filter(archive=False).annotate(last_driver_reference_number=subquery)

然后我们应该可以对注释字段进行排序,参见https://stackoverflow.com/a/1396313/202168

所以:

qs = (
    User
    .objects
    .filter(archive=False)
    .annotate(last_driver_reference_number=subquery)
    .order_by("last_driver_reference_number")
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM