From 53b53d147b0a9e9f19e41d716e1348c42b9f27e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Dlouh=C3=BD?= Date: Mon, 29 Jul 2024 14:28:46 +0200 Subject: [PATCH] add possibility to specify queryset by filters --- .../0011_alter_exportjob_queryset.py | 20 +++++++++++++++++++ import_export_celery/models/exportjob.py | 17 ++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 import_export_celery/migrations/0011_alter_exportjob_queryset.py diff --git a/import_export_celery/migrations/0011_alter_exportjob_queryset.py b/import_export_celery/migrations/0011_alter_exportjob_queryset.py new file mode 100644 index 0000000..4389ba3 --- /dev/null +++ b/import_export_celery/migrations/0011_alter_exportjob_queryset.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0.7 on 2024-07-29 12:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("import_export_celery", "0010_auto_20231013_0904"), + ] + + operations = [ + migrations.AlterField( + model_name="exportjob", + name="queryset", + field=models.JSONField( + verbose_name="JSON list of pks to export or dict of queryset filters" + ), + ), + ] diff --git a/import_export_celery/models/exportjob.py b/import_export_celery/models/exportjob.py index 66f5691..1878d40 100644 --- a/import_export_celery/models/exportjob.py +++ b/import_export_celery/models/exportjob.py @@ -1,6 +1,5 @@ # Copyright (C) 2019 o.s. Auto*Mat from django.utils import timezone -import json from author.decorators import with_author @@ -67,8 +66,9 @@ def __init__(self, *args, **kwargs): default="", ) - queryset = models.TextField( - verbose_name=_("JSON list of pks to export"), + + queryset = models.JSONField( + verbose_name=_("JSON list of pks to export or dict of queryset filters"), null=False, ) @@ -104,14 +104,19 @@ def get_content_type(self): return self._content_type def get_queryset(self): - pks = json.loads(self.queryset) + queryset_spec = self.queryset + if isinstance(queryset_spec, list): + filters = {"pk__in": queryset_spec} + elif isinstance(queryset_spec, dict): + filters = queryset_spec + # If customised queryset for the model exists # then it'll apply filter on that otherwise it'll # apply filter directly on the model. resource_class = self.get_resource_class() if hasattr(resource_class, "get_export_queryset"): - return resource_class().get_export_queryset().filter(pk__in=pks) - return self.get_content_type().model_class().objects.filter(pk__in=pks) + return resource_class().get_export_queryset().filter(**filters) + return self.get_content_type().model_class().objects.filter(**filters) def get_resource_choices(self): return [