У меня есть простое приложение Django, в котором я пытаюсь объединить несколько значений в аннотацию для упрощения обработки на стороне клиента.
По сути, мне нужно объединить значения нескольких столбцов в один.
Для этого я пытаюсь использовать annotate
с F
функциями:
qs = TimeReport.objects \
.filter(year=year, term=term) \
.annotate(
created_by_first_name=F('created_by__first_name'),
created_by_last_name=F('created_by__last_name'),
total_hours = F('master_thesis_supervision_hours')
+ F('semester_project_supervision_hours')
+ F('other_job_hours')
+ F('MAN_hours')
+ F('exam_proctoring_and_grading_hours')
+ F('class_teaching_exam_hours')
+ F('class_teaching_practical_work_hours')
+ F('class_teaching_preparation_hours')
+ F('class_teaching_teaching_hours'),
) \
.all().values()
Удивительно, но когда я проверяю содержимое вычисляемого поля, оно ничего не содержит:
list(qs)[0]['total_hours']
None
Попытка разыграть результат функции F
также не дает:
...
total_hours = int(F('master_thesis_supervision_hours'))
+int(F('semester_project_supervision_hours'))
+ ...
Я также пытался обновить models.py
, чтобы добавить свойство:
@property
def total_hours(self):
return self.master_thesis_supervision_hours + self.class_teaching_total_hours + self.semester_project_supervision_hours + self.other_job_hours + self.MAN_hours + self.exam_proctoring_and_grading_hours
и обновите views.py
соответственно:
qs = TimeReport.objects \
.filter(year=year, term=term) \
.annotate(
created_by_first_name=F('created_by__first_name'),
created_by_last_name=F('created_by__last_name'),
total_hours = F('total_hours'),
) \
.all().values()
Но я получаю следующую ошибку:
django .core.exceptions.FieldError: Не удается разрешить ключевое слово total_hours в поле.
Как правильно это сделать?