微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django导入导出:导入错误-AttributeError:'str'对象没有属性'year'

如何解决Django导入导出:导入错误-AttributeError:'str'对象没有属性'year'

我正在尝试使用django-import-export包将csv导入到我的django模型中。 csv非常简单,标题行和值的一行。 csv中有两个字段在模型中定义为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.Field,它们不包含在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中定义了一个Resource类,并且该类可用于导出csv。但是,当我尝试导入csv时-我收到属性错误

AttributeError: 'str' object has no attribute 'year'

下面列出了完整的追溯。

我试图通过向Resource类添加before_save_instance方法解决此问题。 但是我仍然遇到同样的错误。我已经浏览过文档并搜索了堆栈溢出,但是找不到如何使用import-export包处理导入的明确说明。

#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:44:10:00,00:44:00:00,01:45:10:00,6,1080p,25p,V:\Vantage_Watch\060171_25p_EM.mov,0:00:00,WJH101,725380,INTL,INT,C,TVD,PROHQ,ENG,178,ENG-51ST_DME-51ST_DME-Opt,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",in <listcomp>
    return [resource.export_field(f,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文件中存储日期的格式。

日期字符串需要正确设置格式,或者日期字符串应转换为正确的日期格式

将日期字符串转换为日期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

OR

在CSV文件中,日期应采用%Y-%m-%d格式

假设before_save_instance()可以正常工作,并且CSV文件7/6/20中的日期为2020年6月7日。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。