From a86d23ab3c668f4032809a6dcf9e801665b25237 Mon Sep 17 00:00:00 2001 From: lautarodapin-magoya Date: Tue, 23 Jul 2024 15:47:57 -0300 Subject: [PATCH 1/2] Fix: avoid loading unnnecesary data into memory --- import_export_celery/admin_actions.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/import_export_celery/admin_actions.py b/import_export_celery/admin_actions.py index 2c06434..892f119 100644 --- a/import_export_celery/admin_actions.py +++ b/import_export_celery/admin_actions.py @@ -40,15 +40,14 @@ def run_export_job_action(modeladmin, request, queryset): def create_export_job_action(modeladmin, request, queryset): - if queryset: - arbitrary_obj = queryset.first() + if queryset is not None: ej = ExportJob.objects.create( - app_label=arbitrary_obj._meta.app_label, - model=arbitrary_obj._meta.model_name, + app_label=queryset.model._meta._meta.app_label, + model=queryset.model._meta._meta.model_name, queryset=json.dumps( [ - str(obj.pk) if isinstance(obj.pk, UUID) else obj.pk - for obj in queryset + str(pk) if isinstance(pk, UUID) else pk + for pk in queryset.values_list("pk", flat=True) ] ), site_of_origin=request.scheme + "://" + request.get_host(), From 510e400455fe1f3fbafe8bd0808a55b0cd1c6143 Mon Sep 17 00:00:00 2001 From: lautarodapin-magoya Date: Wed, 24 Jul 2024 10:44:16 -0300 Subject: [PATCH 2/2] Fix: use count instead of len, avoiding loading all in memory --- import_export_celery/tasks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/import_export_celery/tasks.py b/import_export_celery/tasks.py index ef3083b..0f786d9 100644 --- a/import_export_celery/tasks.py +++ b/import_export_celery/tasks.py @@ -1,5 +1,6 @@ # Author: Timothy Hobbs hobbs.cz> from django.utils import timezone +from django.db.models import QuerySet import os from celery import shared_task @@ -215,7 +216,7 @@ def run_export_job(pk): export_job = models.ExportJob.objects.get(pk=pk) resource_class = export_job.get_resource_class() queryset = export_job.get_queryset() - qs_len = len(queryset) + qs_len = queryset.count() if isinstance(queryset, QuerySet) else len(queryset) class Resource(resource_class): def __init__(self, export_job, *args, **kwargs):