Django: фильтр запросов
У меня есть две связанные модели: одна - список участников. Другая - список времени, когда они регистрировались или покидали офис.
В таблице (Checkin) есть одна запись для каждой пары checkin/checkout. Таким образом, для любого участника может быть много записей.
Как я могу получить только самую последнюю (самую свежую) запись для регистрации участника, а затем передать участника и только эту последнюю запись регистрации в мой шаблон?
Насколько я могу судить, в моем шаблоне нет возможности сделать что-то вроде last(), так что как мне отфильтровать, чтобы получить только одну запись?
Спасибо.
Модели:
class Participant(models.Model):
first_name = models.CharField(max_length=50)
middle_initial = models.CharField(max_length=50, blank=True)
class CheckIn(models.Model):
adult = models.ForeignKey(
Participant, on_delete=models.CASCADE, blank=True, null=True, related_name='adult_checkin')
checkin = models.DateTimeField(blank=True, null=True)
checkout = models.DateTimeField(blank=True, null=True)
Просмотр сниппета:
p_checkins = Participant.objects.all().order_by('created')
queryset = p_checkins
context_object_name = "the_list"
template_name = 'list_of_checkins.html'
Вы можете получить данные через последний checkin или checkout.
Для регистрации :
p_checkins = CheckIn.objects.all().order_by('-checkin')[0]
Для выписки :
p_checkins = CheckIn.objects.all().order_by('-checkout')[0]
Получить имя участника по :
name = p_checkins.adult.first_name
Когда вы используете (-), ваше последнее обновление будет запрошено из базы данных.
p_checkins = CheckIn.objects.all().order_by('-checkin')
или
p_checkins = CheckIn.objects.all().order_by('-checkout')
вы можете аннотировать последнее значение через подзапрос к участнику
from django.db.models import OuterRef, Subquery
checkin_q = CheckIn.objects.filter(adult=OuterRef('pk')).order_by('-checkin')
queryset = Participant.objects.annotate(last_checkin=Subquery(checkin_q.values('checkin')[:1]))
смотрите https://docs.djangoproject.com/en/4.0/ref/models/expressions/#subquery-expressions
Большинство ответов на данный момент являются правильными в нескольких аспектах. Одно замечание: если ваши значения check_in
или check_out
(в зависимости от того, что вы используете) не хронологические (и под "последними" вы подразумеваете последние добавленные), вам нужно добавить поле created_at
datetime с опцией auto_now True
, или упорядочить по pk
.
В дополнение к другим ответам и моему комментарию выше, вы также можете получить последнюю регистрацию, используя связанный менеджер на объекте участника.