Как упорядочить набор запросов с помощью related_name в django

У меня есть модель User, которая связана с моделью DriverCar с помощью related_name='driver'. Каждый пользователь может быть связан с несколькими автомобилями. Модель DriverCar имеет поле "reference_number" типа integer. Я хочу показать список всех пользователей, упорядоченный поreference_number последнего объекта DriverCar, связанного с пользователем. Использование запроса типа 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)

Это будет объединено из нескольких существующих ответов на другие вопросы...

Вам понадобится подзапрос для получения значения reference_number для "последнего объекта DriverCar, связанного с пользователем"

Смотрите https://stackoverflow.com/a/60217311/202168

Предполагаю, что "последний" может означать "самый высокий пк" (из DriverCar)

Поэтому подзапрос будет выглядеть так:

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

Мы можем аннотировать наш набор запросов User со значением из подзапроса следующим образом:

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")
)
Вернуться на верх