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.

В дополнение к другим ответам и моему комментарию выше, вы также можете получить последнюю регистрацию, используя связанный менеджер на объекте участника.

Вернуться на верх