我有以下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)
但是,如果我在桌子上吃完饭和未完成的饭菜,这将不起作用。 我该如何解决?
答案 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)
)
)
~
翻转“存在”值。要确定是否有成品,将查看是否还有未完成的饭菜,然后翻转。