如何解决基于子元素的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,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)
但是,如果我在桌子上吃完饭和未完成的饭菜,这将不起作用。 我该如何解决?
解决方法
我将使用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)
)
)
~
翻转“存在”值。要确定是否有成品,将查看是否还有未完成的饭菜,然后翻转。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。