• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

django-import-export / django-import-export / 17400817337

02 Sep 2025 10:32AM UTC coverage: 100.0%. Remained the same
17400817337

push

github

web-flow
[pre-commit.ci] pre-commit autoupdate (#2105)

updates:
- [github.com/adamchainz/django-upgrade: 1.25.0 → 1.27.0](https://github.com/adamchainz/django-upgrade/compare/1.25.0...1.27.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

2303 of 2303 relevant lines covered (100.0%)

4.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/import_export/instance_loaders.py
1
class BaseInstanceLoader:
5✔
2
    """
3
    Base abstract implementation of instance loader.
4
    """
5

6
    def __init__(self, resource, dataset=None):
5✔
7
        self.resource = resource
5✔
8
        self.dataset = dataset
5✔
9

10
    def get_instance(self, row):
5✔
11
        raise NotImplementedError
5✔
12

13

14
class ModelInstanceLoader(BaseInstanceLoader):
5✔
15
    """
16
    Instance loader for Django model.
17

18
    Lookup for model instance by ``import_id_fields``.
19
    """
20

21
    def get_queryset(self):
5✔
22
        return self.resource.get_queryset()
5✔
23

24
    def get_instance(self, row):
5✔
25
        try:
5✔
26
            params = {}
5✔
27
            for key in self.resource.get_import_id_fields():
5✔
28
                field = self.resource.fields[key]
5✔
29
                params[field.attribute] = field.clean(row)
5✔
30
            if params:
5✔
31
                return self.get_queryset().get(**params)
5✔
32
            else:
33
                return None
5✔
34
        except self.resource._meta.model.DoesNotExist:
5✔
35
            return None
5✔
36

37

38
class CachedInstanceLoader(ModelInstanceLoader):
5✔
39
    """
40
    Loads all possible model instances in dataset avoid hitting database for
41
    every ``get_instance`` call.
42

43
    This instance loader work only when there is one ``import_id_fields``
44
    field.
45
    """
46

47
    def __init__(self, *args, **kwargs):
5✔
48
        super().__init__(*args, **kwargs)
5✔
49

50
        pk_field_name = self.resource.get_import_id_fields()[0]
5✔
51
        self.pk_field = self.resource.fields[pk_field_name]
5✔
52

53
        # If the pk field is missing, all instances in dataset are new
54
        # and cache is empty.
55
        self.all_instances = {}
5✔
56
        if self.dataset.dict and self.pk_field.column_name in self.dataset.dict[0]:
5✔
57
            ids = [self.pk_field.clean(row) for row in self.dataset.dict]
5✔
58
            qs = self.get_queryset().filter(**{"%s__in" % self.pk_field.attribute: ids})
5✔
59

60
            self.all_instances = {
5✔
61
                self.pk_field.get_value(instance): instance for instance in qs
62
            }
63

64
    def get_instance(self, row):
5✔
65
        if self.all_instances:
5✔
66
            return self.all_instances.get(self.pk_field.clean(row))
5✔
67
        return None
5✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc