После многих проб и ошибок и проверки похожих вопросов, я думаю, что стоит задать это со всеми подробностями.
Вот простая модель. Допустим, у нас есть модель Book и модель Reserve, которая содержит данные резервирования для каждой книги.
class Book(models.Model):
title = models.CharField(
'Book Title',
max_length=50
)
name = models.CharField(
max_length=250
)
class Reserve(models.Model):
book = models.ForeignKey(
Book,
on_delete=models.CASCADE
)
reserve_date = models.DateTimeField()
status = models.CharField(
'Reservation Status',
max_length=5,
choices=[
('R', 'Reserved'),
('F', 'Free')
]
)
Я добавил книгу и две записи резервирования для модели:
from django.utils import timezone
book_inst = Book(title='Book1')
book_inst.save()
reserve_inst = Reserve(book=book_inst, reserve_date=timezone.now(), status='R')
reserve_inst.save()
reserve_inst = Reserve(book=book_inst, reserve_date=timezone.now(), status='F')
reserve_inst.save()
My Цель состоит в том, чтобы получить данные о последнем бронировании для каждой книги. Основываясь на других вопросах, я понял это следующим образом:
from django.db.models import F, Q, Max
reserve_qs = Reserve.objects.values(
'book__title'
)
reserve_qs
теперь выполняет последнее действие для каждой книги, но когда я добавляю .value()
, он игнорирует группировку и возвращает все записи.
Я также пытался фильтровать с помощью F:
Reserve.objects.values(
'book__title'
).annotate(
last_action=Max('reserve_date')
).values(
).filter(
reserve_date=F('last_action')
)
Я использую Django 3 и SQLite.