Как избежать подобных строк при импорте Excel с помощью django -import-export? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть файл Excel с несколькими строками, содержащими похожие данные. Например, имя сотрудника повторяется в нескольких строках, но я хотел бы импортировать такие записи только один раз, а не несколько раз в свою базу данных, чтобы избежать избыточности. Я видел, что метод skip_rows может помочь в этом, но до сих пор не могу понять, как именно его использовать, поскольку документация очень ограничена. Любая помощь будет оценена :)

1 Ответ

0 голосов
/ 17 июня 2020

Один из способов добиться этого - сохранить список уже импортированных значений (на основе некоторого идентификатора), а затем переопределить skip_row(), чтобы игнорировать любые дубликаты.

Например:

class _BookResource(resources.ModelResource):

    imported_names = set()

    def after_import_row(self, row, row_result, row_number=None, **kwargs):
        self.imported_names.add(row.get("name"))

    def skip_row(self, instance, original):
        return instance.name in self.imported_names

    class Meta:
        model = Book
        fields = ('id', 'name', 'author_email', 'price')

Затем при запуске будут пропущены все дубликаты:

    # set up 2 unique rows and 1 duplicate
    rows = [
        ('book1', 'email@example.com', '10.25'),
        ('book2', 'email@example.com', '10.25'),
        ('book1', 'email@example.com', '10.25'),
    ]
    dataset = tablib.Dataset(*rows, headers=['name', 'author_email', 'price'])

    book_resource = _BookResource()
    result = book_resource.import_data(dataset)
    print(result.totals)

Это даст результат:

OrderedDict([('new', 2), ('update', 0), ('delete', 0), ('skip', 1), ('error', 0), ('invalid', 0)])
...