基于子元素的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 值。要确定是否有任何已完成的,这将查看是否还有未完成的饭菜,然后将其翻转。
我有以下 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 值。要确定是否有任何已完成的,这将查看是否还有未完成的饭菜,然后将其翻转。