#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
сохранить значения. Есть какие — нибудь мысли о том, как я могу это исправить?