안녕하세요 저는 다음 코드로 하위 쿼리를 사용하여 ListView에서 각 프로젝트의 진행률을 얻고 있습니다.
class projects(LoginRequiredMixin, ListView):
model = Project
template_name = 'project_list.html'
ordering = ['project_title']
paginate_by = 10
queryset = Project.objects.annotate(
todo_done=Count('todo', filter=Q(todo__state=True)) * 100 / Count('todo'),
todo_left=Count('todo', filter=Q(todo__state=False)) * 100 / Count('todo'),
)
프로젝트에는 12 개의 작업이 있고 8 개는 완료되고 4 개는 진행 중입니다. 시스템은 완료율 66 %, 진행률 33 %를 반환하며 합계는 100 %가 아니라 99 %입니다.
{{ project.todo_done }}
{{ project.todo_left }}
1 %가 누락 되었기 때문에 막대의 일부가 비어 있습니다. 나는 다음과 같이 원형을 사용하려고 시도하지만 불가능합니다
todo_done=round(Count('todo', filter=Q(todo__state=True)) * 100 / Count('todo')),
TypeError: type CombinedExpression doesn't define __round__ method
Python의 round
는 데이터베이스 표현식에 대해 전혀 이해하지 못하기 때문에 사용할 수 없습니다 . 그러나 Round
[Django-doc] 표현식 을 사용할 수 있습니다 .
from django.db.models import F
from django.db.models.functions import Round
queryset = Project.objects.annotate(
todo_done=Round(Count('todo', filter=Q(todo__state=True)) * 100 / Count('todo')),
todo_left=100*Count('todo') - F('todo_done'),
)
는 IF state
의 Todo
의 만 할 수있다 True
거나 False
, 그것을 뺄 더 나은 아마 todo_done
100 배에서 Count('todo')
일반적으로 과정이 없습니다로하지 않는 두, 100 합계 것이라는 점을 보장 그 이후 에는 관련 Todo
들.
일부 데이터베이스는 두 피연산자가 정수인 경우 정수 나눗셈을 사용합니다 FloatField
. 이를 다음으로 캐스트하여이를 방지 할 수 있습니다 .
from django.db.models import F, FloatField
from django.db.models.functions import Cast, Round
queryset = Project.objects.annotate(
todo_done=Round(
Cast(Count('todo', filter=Q(todo__state=True)), output_field=FloatField())
* 100 / Count('todo')
),
todo_left=100*Count('todo') - F('todo_done'),
)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다