[英]'MediaDefiningClass' object is not iterable - django-import-export
[英]Django-Import-Export: Import Error - AttributeError: 'str' object has no attribute 'year'
我正在尝试使用 django-import-export package 将 csv 导入我的 django model。csv 非常简单,一行 header 和一行值。 csv 上有两个字段在 model 中定义为 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)
model 中还有另一组 DateTime.Field 未包含在 csv 文件中。 为此,我已将 header 字段添加到 csv,但 csv hs 没有这些字段的值。
created = models.DateTimeField(blank=True)
updated = models.DateTimeField(blank=True)
deleted_at = models.DateTimeField(blank=True,null=True)
对于 django-import-export package,我在我的 admin.py 中定义了一个资源 class,它正在导出一个 csv。但是当我尝试导入一个 csv 时 - 我得到一个属性错误。
AttributeError: 'str' object has no attribute 'year'
下面列出了完整的回溯。
我试图通过向资源 class 添加before_save_instance
方法来解决此问题。但我仍然遇到相同的错误。 我浏览了文档并搜索了堆栈溢出,但找不到关于如何使用 import-export package 处理导入的明确解释。
#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_Watch\060171_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'
这是因为日期存储在 csv 文件中的格式。
日期字符串需要正确格式化或日期字符串应转换为正确的日期格式
将日期字符串转换为日期对象
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 中的日期是 2020 年 6 月 7 日。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.