基于子元素的Django查询集日期过滤器

Django queryset date filter based on subelement

我有以下 Django 模型:

class Table(models.Model):
# model fields

    @property
    def is_finished(self):
        return not Meal.objects.filter(table=self)\
            .filter(finished_time=None).exists()

class Meal(models.Model):
    table = models.ForeignKey(
        Table,
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name='meals'
    )
    finished_time = models.DateTimeField(null=True, blank=True, default=None)

一个table如果它的所有餐点都有finished_time,则认为它已经完成。 我想在查询集中注释 is_finished,以排除用餐结束的 tables。

类似于:

Table.objects.all()\
    .annotate(has_meals=Count('meals__finished_time'))\
    .annotate(finished=Min('meals__finished_time'))\
    .filter(finished=None)\
    .exclude(has_meals=0)

但是如果我在 table 上吃完饭和未吃完饭,这将不起作用。 我该如何解决这个问题?

我会使用 Exists 子查询。

from django.db.models import Exists, OuterRef
Table.objects.all().annotate(
    is_finished=~Exists(
        Meal.objects.filter(table=OuterRef('id'), finished_time__isnull=True)
    )
)

~ 翻转 Exists 值。要确定是否有任何已完成的,这将查看是否还有未完成的饭菜,然后将其翻转。