Улучшить производительность написания Django наборов запросов для многих - PullRequest
0 голосов
/ 12 марта 2020

У меня есть приложение Django 1.11. Есть модель Campaign, где я могу указать параметры для выбора Users. Когда я запускаю Campaign, я создаю экземпляр CampaignRun с FK compaign_id и M2M users. Каждый раз, когда запускается кампания, в результирующем наборе запросов могут находиться разные пользователи, поэтому я хотел бы сохранить запись об этом. Я делаю это так, как показано ниже:

    run = CampaignRun.objects.create(campaign=self, ...)
    (...)
    filtered_users = User.objects.filter(email__in=used_emails)
    run.users.add(*filtered_users)   # I also tried run.users.set(filtered_users)
    run.save()

Однако оказывается, что если кампания запускается с django -admin, а итоговое число пользователей превышает приблизительно 150, процесс занимает более 30 секунд. , что приводит к ошибке 502: Bad Gateway.

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

...