Django Queryset для включения и фильтрации связанных данных
Я пытаюсь создать шаблон со списком участников (взрослых и несовершеннолетних) и их последним временем регистрации и выезда.
Существует два типа участников, и они представлены в двух таблицах/моделях: AdultParticipant и MinorParticipant. MinorParticipants имеют связь внешнего ключа с ParentParticipant.
Информация о регистрации (checkin и checkout) хранится в одной таблице независимо от того, относятся ли данные регистрации к AdultParticipant или MinorParticipant. Одна запись в этой таблице фиксирует ссылку на участника и время регистрации и выписки.
У каждого участника может быть много регистраций. Запись о регистрации может иметь только одного участника.
Код в том виде, в котором он существует сейчас, делает все, что я хочу, за исключением того, что он отображает каждую запись регистрации участника. Я хочу отображать только последнюю запись участника.
Как я могу построить набор запросов, чтобы включить информацию об участнике и включить только последнюю запись о регистрации участника?
Заранее благодарю. Вы очень цените меня.
Модели
class AdultParticipant(models.Model):
first_name = models.CharField(max_length=50)
middle_initial = models.CharField(max_length=50, blank=True)
class MinorParticipant(models.Model):
first_name = models.CharField(max_length=50)
middle_initial = models.CharField(max_length=50, blank=True)
parent = models.ForeignKey(
WaiverAdult, on_delete=models.CASCADE, related_name='minor_of_adult')
class CheckIn(models.Model):
adult = models.ForeignKey(
AdultParticipant, on_delete=models.CASCADE, blank=True, null=True, related_name='adult_checkin')
minor = models.ForeignKey(
MinorParticipant, on_delete=models.CASCADE, blank=True, null=True, related_name='minor_checkin')
checkin = models.DateTimeField(blank=True, null=True)
checkout = models.DateTimeField(blank=True, null=True)
Вид
class WaiverListView(ListView):
participants_and_checkins = Participant.objects.all().order_by('created')
queryset = participants_and_checkins
context_object_name = "the_list"
template_name = 'list.html'
Шаблон
{% for adult in the_list %}
<tr>
<td class="fs-6">
{% for c in adult.adult_checkin.all|dictsortreversed:"checkin" %}
In: {{ c.checkin }}</br>
Out: {{c.checkout}}</br>
{% endfor %}
</td>
<td>{{adult.last_name}}</td>
<td>{{adult.first_name}}</td>
</tr>
{% for child in adult.minor_of_adult.all %}
<tr>
<td class="fs-6">
{% for c in child.minor_checkin.all|dictsortreversed:"checkin" %}
In: {{ c.checkin }}</br>
Out: {{c.checkout}}
{% endfor %}
</td>
<td>{{child.last_name}}</td>
<td>{{child.first_name}}</td>
</tr>
{% endfor %}
{% endfor %}
в вашем шаблоне измените checkin.all
на checkin.last
.
Также можно избавиться от цикла for, например
In: {{ child.minor_checkin.last.checkin }}</br>
Out: {{child.minor_checkin.last.checkout}}