Как получить данные за последние шесть месяцев из поля даты - django

У меня есть модель, как указано ниже

class employee(models.Model):
employee_name = models.CharField(max_length=100)
joining_Date = models.DateField(blank=False, null=False)

Я хочу получить данные за последние шесть месяцев (включая текущий месяц), объединенные с подсчетом сотрудников по месяцам.

Пример: Июль : 12, Июнь : 10, май : 8, апрель : 16, март : 13, Февраль : 10,

joining_Date хранится как "2022-07-22".Как это сделать, имея поле даты.

Заранее спасибо.

Вы можете попробовать найти максимально подходящую дату и отфильтровать по ней

from datetime import date
from dateutil.relativedelta import relativedelta


def find_employee(request):
    today = date.today()
    six_months = today - relativedelta(months=6)
    emloyed_for_six_month = Employee.objects.filter(joining_Date__gte = six_months)

Ваша модель employee должна быть названа с большой буквы. Это обычное https://stackoverflow.com/a/386054/14632651

Чтобы получить количество новых сотрудников за месяц, необходимо сделать аннотацию и использовать Trunc для получения только месяца, см. ниже:

from datetime import date
from dateutil.relativedelta import relativedelta

from django.db.models.functions import Trunc

six_months_ago = date.today() + relativedelta(months=-6)

employees_per_month = Employee.objects.filter(join_date__gte=six_months_ago)\
   .annotate(
      joining_month=Trunc('joining_date', 'month', output_field=DateField())
   ) \
   .order_by('joining_month') \
   .values('joining_month') \
   .annotate(employees=Count('joining_month'))

Это даст вам набор запросов со следующей структурой:

<QuerySet [{'joining_month': datetime.date(2022, 6, 1), 'employees': 2},
    {'joining_month': datetime.date(2022, 7, 1), 'employees': 1}, ...

Редактировать. Чтобы преобразовать QS в плоский дикт:

employee_count_dict = {}
for employee_count in employees_per_month: 
   employee_count_dict[val['joining_month']] = val['employees']
Вернуться на верх