我如何在 Django 中进行此查询?
How can I make this query in Django?
我有这些字段(test_type, status, begin_time, and_time
)。status
字段有三个状态(0
、1
或2
)。
我想创建一个查询集,其中:
(test_type = 'difficult') and
(if status=1 and begin_time + 2x(end_time - begin_time) < timezone.now()) or
(if status=2 and end_time < timezone.now())
然后 select 这些字段。如果状态 state=0 我不想 select 该字段。
我怎样才能用 Django ORM 制作这个查询集?
你将不得不在 Django 中使用 Q 对象,
Model.objects.filter((Q(status=1) & Q(begin_time < computed_value_here)) | (Q(status=2) & Q(end_time < computed_value_here)), test_type='difficult')
像下面这样的东西应该可以工作。您需要为 "twice_end_time" 创建注释,因为 Django 不支持过滤器中的那种计算
Model.objects.annotate(
twice_end_time=F('begin_time') + 2 * F('end_time') - F('begin_time')
).filter(
Q(test_type='difficult') &
Q(status=1, twice_end_time__lt=timezone.now()) |
Q(status=2, end_time__lt=timezone.now())
)
我有这些字段(test_type, status, begin_time, and_time
)。status
字段有三个状态(0
、1
或2
)。
我想创建一个查询集,其中:
(test_type = 'difficult') and
(if status=1 and begin_time + 2x(end_time - begin_time) < timezone.now()) or
(if status=2 and end_time < timezone.now())
然后 select 这些字段。如果状态 state=0 我不想 select 该字段。 我怎样才能用 Django ORM 制作这个查询集?
你将不得不在 Django 中使用 Q 对象,
Model.objects.filter((Q(status=1) & Q(begin_time < computed_value_here)) | (Q(status=2) & Q(end_time < computed_value_here)), test_type='difficult')
像下面这样的东西应该可以工作。您需要为 "twice_end_time" 创建注释,因为 Django 不支持过滤器中的那种计算
Model.objects.annotate(
twice_end_time=F('begin_time') + 2 * F('end_time') - F('begin_time')
).filter(
Q(test_type='difficult') &
Q(status=1, twice_end_time__lt=timezone.now()) |
Q(status=2, end_time__lt=timezone.now())
)