Django import export - Как пропустить новые строки и обновить только существующие - PullRequest
0 голосов
/ 01 мая 2020

При импорте файла я хочу пропустить все новые строки, которые не существуют, и обновить и изменить только те, которые уже существуют. Я несколько дней пытался решить эту проблему, любые идеи помогут.

https://ibb.co/1Gw4Q19

также тип файла ".xls" или ".xlsx"

вот мой код:

models.py:

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Book(models.Model):
    name = models.CharField('Book name', max_length=100)
    author = models.ForeignKey(Author, blank=True, null=True, on_delete=models.CASCADE)
    author_email = models.EmailField('Author email', max_length=75, blank=True)
    imported = models.BooleanField(default=False)
    published = models.DateField('Published', blank=True, null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    categories = models.ManyToManyField(Category, blank=True)

    def __str__(self):
        return self.name

admin.py:

class BookResource(resources.ModelResource):

    class Meta:
        model = Book
        import_id_field = 'id'
        import_id_fields = ('id',)
        fields = ('id', 'name', 'price',)
        skip_unchanged = True
        report_skipped = True
        dry_run = True


class CustomBookAdmin(ImportMixin, admin.ModelAdmin):
    resource_class = BookResource

    # tried to override it like so but it didn't work
    def skip_row(self, instance, original):
        original_id_value = getattr(original, self._meta.import_id_field)
        instance_id_value = getattr(instance, self._meta.import_id_field)
        if original_id_value != instance_id_value:
            return True
        if not self._meta.skip_unchanged:
            return False
        for field in self.get_fields():
            try:
                if list(field.get_value(instance).all()) != list(field.get_value(original).all()):
                    return False
            except AttributeError:
                if field.get_value(instance) != field.get_value(original):
                    return False
        return True

1 Ответ

0 голосов
/ 03 мая 2020

Таким образом, если вы хотите пропустить все строки в файле импорта, которые еще не существуют в базе данных, то вы можете игнорировать любые строки, у которых нет pk (то есть ранее не было сохранено):

Просто добавьте следующее в ваш BookResource подкласс

def skip_row(self, instance, original):
    return getattr(original, "pk") is None

Надеюсь, это сработает - дайте мне знать, если я что-то неправильно понял.

...