如何解决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 举报,一经查实,本站将立刻删除。