Как выполнить django queryset более эффективным способом, чтобы получить следующий ответ?

вот поля моей модели:

staff = models.ForeignKey(StaffProfile, on_delete = models.SET_NULL, blank=True,null = True)
created_at = models.DateTimeField(auto_now_add=True)
category = models.CharField(max_length = 250,choices = EventStatusChoice.choices,default = EventStatusChoice.PROGRESS_NOTES)
summary = models.CharField(max_length=200, blank=True, null=True)

Варианты категорий событий:

class EventStatusChoice(models.TextChoices):
INJURIES = 'injury','Injuries'
FEEDBACKS = 'feedback','Feedbacks'
ENQUIRIES = 'enquiry','Enquiries'
INCIDENTS = 'incident','Incidents'
PROGRESS_NOTES = 'note','Progress Notes'
WARNING = "warning", "Warning"

Я хочу получить ответ примерно следующего содержания:

 "data": [
    {
        "staff": "admin",
        "injury": 0,
        "feedback": 2,
        "enquiry": 0,
        "incident": 1,
        "note": 0,
        "warning": 0
    },
    {
        "staff": "tutaketuw",
        "injury": 0,
        "feedback": 0,
        "enquiry": 0,
        "incident": 1,
        "note": 0,
        "warning": 0
    },]

Я сделал это по-своему, и он работает хорошо. Ниже приведен мой способ:

def get_staff_summary(self,start = None,end = None,search = None):
    qs = EventModel.objects.get_distinct_staff(search)
    data_list = []
    for i in qs:
        data = {}
        data['staff'] = i['staff__staff__username']
        for j in EventStatusChoice.choices:
            if start != None and end != None:
                data[f'{j[0]}'] = EventModel.objects.filter(category = j[0],staff__staff__username = i['staff__staff__username'],created_at__date__gte = start,created_at__date__lte = end).count()
            else:
                data[f'{j[0]}'] = EventModel.objects.filter(category = j[0],staff__staff__username = i['staff__staff__username']).count()
        data_list.append(data)
    return data_list

Теперь я хочу сделать это более правильным и эффективным способом. Может ли кто-нибудь помочь получить вышеуказанный ответ (или любой другой подобный ответ), используя только Django queryset. В основном я хочу получить список всех сотрудников с их категориями и количеством.

Было бы понятнее, если бы вы предоставили все свои модели, но я думаю, что-то вроде

annotation_dict = {}
for event_choice in EventStatusChoice.choices:
    annotation_dict.update({event_choice[0]: Count("eventmodel", filter=Q(category=eventchoice[0]))})
Staff.objects.annotate(**annotation_dict)
    
Вернуться на верх