![](/img/trans.png)
[英]Using related_name to return queryset not working in django?
[英]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.