#python #python-3.x #django #csv #django-import-export
#python #python-3.x #django #csv #django-импорт-экспорт
Вопрос:
Я пытаюсь использовать пакет django-import-export для импорта csv в мою модель django. csv очень прост, строка заголовка и одна строка значений. в CSV есть два поля, которые определены в модели как DateField для DateField.
#models.py
edit_date = models.DateField(verbose_name="Edit Date", blank=True, default="1970-01-01")
premiere_date = models.DateField(verbose_name="Premiere Date", null=True, blank=True)
существует другой набор DateTime.Поля в модели, которые не включены в файл csv. Я добавил поля заголовка в csv для них, но в csv нет значений для полей.
created = models.DateTimeField(blank=True)
updated = models.DateTimeField(blank=True)
deleted_at = models.DateTimeField(blank=True,null=True)
Для пакета django-import-export у меня есть класс ресурсов, определенный в моем admin.py и он работает для экспорта csv. Но когда я пытаюсь импортировать csv — я получаю ошибку атрибута.
AttributeError: 'str' object has no attribute 'year'
Полная обратная трассировка приведена ниже.
Я попытался исправить это, добавив before_save_instance
метод в класс ресурсов. Но я все еще получаю ту же ошибку. Я просмотрел документы и искал stack overflow, но я не могу найти четкого объяснения того, как обрабатывать импорт с помощью пакета импорта-экспорта.
#admin.py
from datetime import datetime
from dateutil.parser import parse
def before_save_instance(self, instance, using_transactions, dry_run):
instance.edit_date = parse(instance.edit_date).strftime('%y/%m/%d')
instance.premiere_date = parse(instance.premiere_date).strftime('%y/%m/%d')
return instance
Не уверен, что еще мне нужно сделать, чтобы мой импорт заработал?
Кто-нибудь видит, чего мне не хватает?
Line number: 1 - 'str' object has no attribute 'year'
, NGCI, 060171_25p_EM.mov, Europe's New Wild, Return of the Titans, 60171, -----, 7/6/20, Remote, Zach W, Jon B/Troy S, 01:00:00:00, 01:10:00:06, 00:10:00:06, 01:10:02:06, 01:18:58:09, 00:08:56:03, 01:19:00:09, 01:27:39:19, 00:08:39:10, 01:27:41:19, 01:34:04:19, 00:06:23:00, 01:34:06:19, 01:39:07:16, 00:05:00:22, 01:39:09:16, 01:44:10:00, 00:05:00:09, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:00:00:00, 00:44:10:00, 00:44:00:00, 01:45:10:00, 00:44:10:00, 6, 1080p, 25p, V:Vantage_Watch60171_25p_EM.mov, 0:00:00, 0:00:00, WJH101, 725380, INTL, INT, C, TVD, PROHQ, ENG, 178, ENG-51ST_DME-51ST_DME-Opt, 0, 7/6/20, , , , , , , , , , ,
Traceback (most recent call last):
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/widgets.py", line 183, in render
return value.strftime(self.formats[0])
AttributeError: 'str' object has no attribute 'strftime'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/resources.py", line 648, in import_row
diff = self.get_diff_class()(self, original, new)
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/resources.py", line 208, in __init__
self.left = self._export_resource_fields(resource, instance)
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/resources.py", line 229, in _export_resource_fields
return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()]
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/resources.py", line 229, in <listcomp>
return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()]
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/resources.py", line 849, in export_field
return field.export(obj)
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/fields.py", line 125, in export
return self.widget.render(value, obj)
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/import_export/widgets.py", line 185, in render
return datetime_safe.new_date(value).strftime(self.formats[0])
File "/Users/steve/.virtualenvs/ngceng/lib/python3.8/site-packages/django/utils/datetime_safe.py", line 42, in new_date
return date(d.year, d.month, d.day)
AttributeError: 'str' object has no attribute 'year'
Ответ №1:
Это связано с форматом, в котором дата хранится в файле csv.
Строка даты должна быть правильно отформатирована или строка даты должна быть преобразована в правильный формат даты
Преобразовать строку даты в date obj
from datetime import datetime
def before_save_instance(self, instance, using_transactions, dry_run):
format_str = '%d/%m/%y' # the format in which dates are stored in CSV file
instance.edit_date = datetime.strptime(instance.edit_date, format_str)
instance.premiere_date = datetime.strptime(instance.premiere_date, format_str)
return instance
или
В файле CSV даты должны быть в формате %Y-%m-%d
Предполагая, что before_save_instance()
работает так, как задумано, и дата в CSV-файле 7/6/20 — 7 июня 2020 года.
Комментарии:
1. спасибо за предложения. Я пробовал оба, но, к сожалению, они выдают одну и ту же ошибку. Я также попытался просто добавить значения даты в пустые поля даты, чтобы посмотреть, будет ли это иметь какое-либо значение, но это тоже не помогло. Я действительно хотел бы, чтобы в обратной трассировке было точно указано, в каком поле проблема.