Django-Import-Export: ошибка импорта — ошибка атрибута: объект ‘str’ не имеет атрибута ‘year’

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