Django-импорт-экспорт не пропускается без изменений, когда skip_unchanged==True

#django #django-import-export

Вопрос:

Я создаю приложение с помощью Django и хочу импортировать данные из файла Excel с помощью django-импорт-экспорт.

При импорте данных я хочу пропустить неизмененные строки, для этого я использую skip_unchanged = True класс ресурсов (как показано ниже), но я получаю неожиданное поведение. В моей модели у меня есть атрибут updated_at , который является DateTimeField auto_now=True атрибутом with, он принимает новое значение каждый раз, когда я загружаю файл Excel, даже если значения строк в файле не изменились.

Ниже приведены фрагменты моего кода.

models.py

 class HREmployee(models.Model):
    code = models.IntegerField()  
    name_en = models.CharField(max_length=55) 
    status = models.CharField(max_length=75) 
    termination_date = models.DateField(null=True)
    hiring_date = models.DateField() 
    birth_date = models.DateField()
    # other fields to be imported from the file ...

    # fields that I want to use for some purposes (not imported from the file)
    comment = models.TextField()
    updated_at = models.DateTimeField(auto_now=True)

 

resources.py

 
class HREmployeeResource(ModelResource):
    code = Field(attribute='code', column_name='Employee Code')
    name_en = Field(attribute='name_en', column_name='Employee Name - English')
    status = Field(attribute='status', column_name='Employee Status')
    termination_date = Field(attribute='termination_date', column_name='Termination Date')
    hiring_date = Field(attribute='hiring_date', column_name='Hiring Date')
    birth_date = Field(attribute='birth_date', column_name='Birth Date')
    # other fields to be imported ...

    class Meta:
        model = HREmployee
        import_id_fields = ('code', )
        skip_unchanged = True
 

Итак, кто-нибудь может помочь мне исправить это неожиданное поведение, пожалуйста?

Редактировать

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

В файле Excel у меня есть три столбца со значениями дат, как на рисунке ниже, когда я комментирую соответствующие атрибуты в классе ресурсов и выполняю импорт, я получаю ожидаемое поведение (если в файле нет изменений, тип import_type равен skip и в БД не вносятся изменения).

введите описание изображения здесь

Я отредактировал код классов моделей и ресурсов (пожалуйста, проверьте выше).

Ответ №1:

Это должно быть легко исправить, просто используйте fields параметр для определения только полей, которые вы хотите импортировать (документы).:

 class Meta:
  ...
  fields = ('code', 'name',)
 

Если skip_unchanged верно, то только эти поля будут сравниваться на предмет изменений, и экземпляр будет обновлен, если какое-либо из них изменилось, в противном случае оно будет пропущено.

Имя поля должно быть именем атрибута модели, а не именем столбца при импорте.

Комментарии:

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

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

3. Я пробовал с dry_run=False и dry_run=True , но ничего не изменилось, я все равно получаю import_type равные update значения, и строки в БД обновляются, когда dry_run=False .

4. единственным решением будет пройти через отладчик и выяснить, что происходит не так

5. Я нашел причину этой проблемы, это поля даты. В файле у меня есть столбцы со значениями дат, и в модели я должен DateField сохранить значения. Есть какие — нибудь мысли о том, как я могу это исправить?