Django:查询过滤器



我有两个相关的模型:一个是参与者列表。另一个是他们入住或离开办公室的次数列表。

表(Checkin)对每个签入/签出对都有一条记录。因此,任何参与者都可以有许多记录。

我如何才能检索只有最后(最近)记录的参与者签入,然后传递参与者和只有最近的签入记录到我的模板?

据我所知,在我的模板中没有能力做像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)

视图snipit:

p_checkins = Participant.objects.all().order_by('created')
queryset = p_checkins
context_object_name = "the_list"
template_name = 'list_of_checkins.html'

当您使用(-)时,您的最新更新将从数据库查询。

p_checkins = CheckIn.objects.all().order_by('-checkin')

p_checkins = CheckIn.objects.all().order_by('-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

您可以通过子查询将最新值注释给参与者

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_incheck_out值(无论您使用哪种值)不是按时间顺序排列的(这里的"最近"指的是最后添加的),则需要添加带有auto_now选项Truecreated_at日期时间字段,或者按pk排序。

除了提供的其他答案和我上面的评论之外,您还可以通过使用参与者对象上的相关管理器获得最近的签入。

最新更新