Как выполнить 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)