Как упорядочить набор запросов с помощью 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")
)