Django queryset annotation filters (for max)

Django queryset annotation filters (for max)

我有以下型号:

class Room(models.Model):
    # model fields

class Table(models.Model):
    room = models.ForeignKey(
        Room, [...], related_name='tables'
    )

class Seat(models.Model):
    table = models.ForeignKey(
        Table, [...], related_name='seats'
    )
    timestamp = models.DateTimeField(auto_now_add=True)
    is_vip = models.BooleanField(default=False)

我想获取最近一个有vip的座位的时间戳。

像这样轻松获得最新席位:

Room.objects.all().annotate(latest_seat=Max('tables__seats__timestamp'))

但是我如何仅在 is_vip=True 上过滤它?

可以使用Q()表达式

from django.db.models import Q

Room.objects.annotate(
    latest_seat=Max(
        'tables__seats__timestamp',
        <b>filter=Q(tables__seats__is_vip=True)</b>)
)