簡體   English   中英

django queryset無法在annotate和Sum中運行函數

[英]django queryset cannot run function inside annotate and Sum

我有兩個查詢集,我想從這兩個查詢集進行加法運算,但是一個查詢值是Int類型(例如1.5、2.75),但是其他查詢時間像字符串(例如12:20:59)。 我需要將該字符串轉換為Int類型,以便可以在Annotate中使用Sum Function。

第一個查詢集

timesheet_total_by_project = TimesheetEntry.objects.filter(
    created_by_id=current_user,
    timesheet__for_date__gte=start_tim,
    timesheet__for_date__lte=end_date,
    project__is_visible=True
).values(
    'project__name', 'project__id'
).distinct().annotate(totalsum=Sum('minutes', output_field=FloatField()) / 60.0)

第二查詢集

ticket_total_time = Ticket.objects.filter(
     assigned_to=user, total_time__isnull=False, project__is_visible=True
).values(
    'title','project__id'
).distinct().annotate(totalsum=Sum('total_time', output_field=FloatField()) / 60.0)

我努力了

def get_sec(time_str):
        print("string",time_str)
        """Get Seconds from time."""
        h, m, s = time_str.split(':')
        return int(h) * 3600 + int(m) * 60 + int(s)
ticket_total_time = Ticket.objects.filter(assigned_to=user,total_time__isnull=False,project__is_visible=True).values('title','project__id').distinct().annotate(totalsum=Sum(get_sec('total_time'), output_field=FloatField()) / 3600.0)

預期輸出為12.5,但輸出為print(“ string”,time_str)

string total_time

還說

ValueError: not enough values to unpack (expected 3, got 1)
def get_sec(time_str):
    print(f'{time_str = }')
    """Get Seconds from time."""
    if not time_str:
        return 0
    h, m, s = time_str.split(':')
    return int(h) * 3600 + int(m) * 60 + int(s)

MySQL具有STR_TO_DATE函數,該函數會將字符串轉換為日期。 您可以使用Func表達式運行任意數據庫函數:

from django.db.models import F, Func, Value

ticket_total_time = Ticket.objects.filter(
     assigned_to=user, total_time__isnull=False, project__is_visible=True
).values(
    'title','project__id'
).distinct().
annotate(time_t=Func(F('total_time'), Value('%H:%i:%s'), function='STR_TO_DATE')).
annotate(totalsum=Sum('time_t', output_field=FloatField()) / 60.0)

我嘗試了這種解決方案,它工作正常。 現在,Time_to_sec函數正在內部注釋中。

from django.db.models import F, Func

class Time_to_sec(Func):
           function = 'TIME_TO_SEC'
           lookup_name = 'sec'

ticket_total_time = Ticket.objects.filter(assigned_to=user,total_time__isnull=False,project__is_visible=True).values('project__id').distinct().annotate(totalsum=Sum(Time_to_sec('total_time', output_field=FloatField()) / 3600.0))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM