繁体   English   中英

Django-Import-Export: Import Error - AttributeError: 'str' object 没有属性 'year'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM