как разрешить f () принимать десятичные значения - PullRequest
2 голосов
/ 01 октября 2019

Во-первых, мне нужно суммировать оценку студента, прежде чем конвертировать ее в процент. Таким образом, я сумел суммировать свою оценку и каким-то образом преобразовал ее в процент с помощью этого метода.

students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'), percentage=(F('mark')/1100) * 100)

Однако я понял, что F () не принимает десятичное значение. Он принимает только целочисленное значение. Это может привести к ошибке в моем процентном расчете, если значение 'mark' меньше 100.

Например: 600/1100 = 0.54545, тогда будет только 0 к кратному 100. И выведите '0'вместо 54%.

Как разрешить функции принимать десятичное значение?

РЕДАКТИРОВАНИЕ:

def file_load_view(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="studFinal-attendance.csv"'
    writer = csv.writer(response)
    writer.writerow(['Student Name', 'Attendance'])

    students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'),
    percentage=(Cast('mark', FloatField())/1100) * 100)

    #convert the students query set to a values list as the writerow expects a list/tuple
    students = students.values_list('studName__VMSAcc','percentage')

    for student in students:
        writer.writerow(student)
    return response

1 Ответ

3 голосов
/ 01 октября 2019

Вы можете использовать Cast [Django-doc] , чтобы указать, к какому типу он должен быть преобразован, и, таким образом, позволить Django сделать вывод:

from django.db.models import FloatField
from django.db.models.functions import <b>Cast</b>

students = MarkAtt.objects.values('studName__VMSAcc').annotate(
    mark=Sum('attendance'),
    percentage=(<b>Cast(</b>'mark'<b>, FloatField())</b>/1100) * 100
)

и вы можете преобразовать его в десятичное поле в конце, чтобы использовать определенное количество цифр:

from django.db.models import DecimalField, FloatField
from django.db.models.functions import Cast

students = MarkAtt.objects.values('studName__VMSAcc').annotate(
    mark=Sum('attendance'),
    percentage=<b>Cast(</b>
        (Cast('mark', FloatField())/1100) * 100,
        <b>output_field=DecimalField(max_digits=20, decimal_places=2)</b>
    <b>)</b>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...