Как оптимизировать запросы ORM для получения более быстрых результатов?

У меня есть 80k+ записей в таблице Calendar. Когда я запускаю один из следующих двух методов, фильтр или get выполняются слишком долго, из-за чего сервер падает через некоторое время и новые записи не добавляются. Я хочу знать, есть ли еще какие-нибудь методы, с помощью которых я могу решить эту проблему.

Метод 1:

date_list = []
d1 = date(2022, 5, 1)
d2 = date(2022, 6, 30)
delta = d2 - d1
for i in range(delta.days + 1):
    date_list.append(d1 + timedelta(days=i))
profiles = Profile.objects.all()
for j in date_list:
    for i in profiles:
        try:
            Calendar.objects.get(date=j,emp_id = i.emp_id)
        except Calendar.DoesNotExist:
            e = Calander()
            e.team = i.emp_process
            e.date = j
            e.emp_name = i.emp_name
            e.emp_id = i.emp_id
            e.emp_desi = i.emp_desi
            e.att_actual = "Unmarked"
            e.save()

Метод 2:

date_list = []
d1 = date(2022, 5, 1)
d2 = date(2022, 6, 30)
delta = d2 - d1
for i in range(delta.days + 1):
    date_list.append(d1 + timedelta(days=i))
profiles = Profile.objects.all()

for j in date_list:
    for i in profiles:
        cal = Calander.objects.filter(date=j,emp_id = i.emp_id).count()
        if cal < 1:
            e = Calander()
            e.team = i.emp_process
            e.date = j
            e.emp_name = i.emp_name
            e.emp_id = i.emp_id
            e.emp_desi = i.emp_desi
            e.att_actual = "Unmarked"
            e.save()

Попробуйте это:

date_list = []
d1 = date(2022, 5, 1)
d2 = date(2022, 6, 30)
delta = d2 - d1
for i in range(delta.days + 1):
    date_list.append(d1 + timedelta(days=i))

for j in date_list:
    profiles = Profile.objects.exclude(emp_id__in=Calendar.objects.filter(date=j).values('emp_id'))
    calendars = []
    for i in profiles:
        e = Calendar()
        e.team = i.emp_process
        e.date = j
        e.emp_name = i.emp_name
        e.emp_id = i.emp_id
        e.emp_desi = i.emp_desi
        e.att_actual = "Unmarked"
        calendars.append(e)
    Calendar.objects.bulk_create(calendars)
Вернуться на верх