Как вернуть 5 лучших имен в месяц, truncMonth
У меня есть эти модели:
class City(models.Model):
name = models.CharField(max_length=150)
class Hospital(models.Model):
name = models.CharField(max_length=150)
city = models.ForeignKey(City, on_delete=models.CASCADE, related_name="hospital")
class Patient(models.Model):
name = models.CharField(max_length=150)
city = models.ForeignKey(City, on_delete=models.CASCADE, related_name="patients")
hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE, related_name="patients", blank=True, null=True)
date_visited = models.DateTimeField(auto_now_add=True)
я хочу вернуть 5 лучших больниц в месяц, которые посетило больше всего пациентов например:
месяц : 10/1/2022 больница A : 100 пациентов больница B : 95 пациентов больница C : 80 пациент больница D : 60 пациент больница E : 55 пациент
и так далее.
my views.py
from django.db.models.functions import TruncMonth
Patient.objects.annotate(month=TruncMonth('date_visited'))
#im not sure how to complete it!
Я ценю вашу помощь
Спасибо
Следующее должно работать
Hospital.objects.annotate(number_of_patient=Count("patient", filter=Q(date_visited__month=desired_month))).order_by("-number_or_patient")[:5]
Если вам не нужно возвращать число пациентов (оно нужно только для упорядочивания), замените аннотацию на псевдоним
from django.db.models.functions import TruncMonth
top_hospitals = Patient.objects.annotate(month=TruncMonth('date_visited')).values('hospital__name', 'month').annotate(patient_count=Count('id')).order_by('month', '-patient_count').values('hospital__name', 'month', 'patient_count')[:5]