Django RAW SQL запрос как передать сравнение дат

Я работаю с Django Raw SQL, поскольку хочу построить относительно сложный запрос,

В качестве части этого у меня есть оператор case, который говорит: "если дата на записи < сегодня, то 1, иначе 0 - это работает.

".
overdue_phases = task.objects.filter(orgid=orgid, taskid=taskidx).raw('''
    
     SELECT '1' as id, case when research_due < "2022-12-01" AND research_status != "done" then 1 else 0 end as count     
     from app_task where taskid = "''' + taskidx + '''"''')
                   
overdue_phases = task.objects.filter(orgid=orgid, taskid=taskidx).raw('''

 SELECT '1' as id, case when research_due < "2022-12-01" AND research_status != "done" then 1 else 0 end as count     
 from app_task where taskid = "''' + taskidx + '''"''')

Однако, когда я хочу поменять жестко закодированную дату на TODAY(), я не могу заставить ее работать. Я пробовал передавать в скрипт переменную python date (td = datetime.date.today()), но это не дает нужных результатов!

Может ли кто-нибудь посоветовать мне, пожалуйста?

There is no need to do this. You can use condition expressions [Django-doc]:

from django.db.models import Case, Q, Value, When

overdue_phases = task.objects.filter(orgid=orgid, taskid=taskidx).annotate(
    count=Case(
        When(
            ~Q(research_status='done'),
            research_due__lt='2022-12-01',
            then=Value(1),
        ),
        default=Value(0),
    )
)

Или если достаточно и булевого значения:

from django.db.models import Q

overdue_phases = task.objects.filter(orgid=orgid, taskid=taskidx).annotate(
    count=~Q(research_status='done') & Q(research_due__lt='2012-12-01')
)

или для старых версий Django с помощью ExpressionWrapper [Django-doc]:

from django.db.models import BooleanField, ExpressionWrapper, Q

overdue_phases = task.objects.filter(orgid=orgid, taskid=taskidx).annotate(
    count=ExpressionWrapper(
        ~Q(research_status='done') & Q(research_due__lt='2012-12-01'),
        output_field=BooleanField(),
    )
)

Вы можете заменить '2022-12-01' на date.today().

Вернуться на верх