Один из способов добиться этого - сохранить список уже импортированных значений (на основе некоторого идентификатора), а затем переопределить 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)])