基于子元素的Django queryset日期过滤器

时间:2020-08-26 17:37:55

标签: django django-models django-queryset

我有以下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)

如果一张桌子的所有饭菜都带有Finished_time,则该桌子被视为完成。 我想在查询集中注释is_finished,以排除进餐的表。

类似的东西:

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

但是,如果我在桌子上吃完饭和未完成的饭菜,这将不起作用。 我该如何解决?

1 个答案:

答案 0 :(得分:1)

我将使用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)
    )
)

~翻转“存在”值。要确定是否有成品,将查看是否还有未完成的饭菜,然后翻转。

相关问题