将csv文件导入django模型
django-csvimport的Python项目详细描述
django csv导入
Ed Crewe-2019年4月
概述
django csvimport是一个通用的导入工具,允许为 正在填充数据。egg安装一个带有文件上传字段的管理csvimport模型。 添加新的csvimport并上载逗号分隔值文件或ms excel文件。
上载触发与文件头行匹配的导入机制 选定模型中字段的字段名。导入包含所有必需字段的任何行。 可选的必需字段可以指定为上载的一部分。 默认情况下,不插入重复值行。
导入也可以作为自定义命令运行,即manage.py importcsv filename 可通过cronjob等方式使用。
对于csv文件导入,如果其架构未知,并且没有要导入的现有模型,则 是另一个命令inspectcsv,从csv文件生成模型代码,从数据中猜测数据类型 使用https://messytables.readthedocs.org" rel="nofollow">https://messytables.readthedocs.org-若要使用此命令,请pip install messytables。
核心导入代码基于jonathan holst的http://djangosnippets.org/snippets/633/" rel="nofollow">http://djangosnippets.org/snippets/633/。 它增加了字符编码处理,模型字段和列自动检测,管理界面, 自定义命令等。
版本2-2014年9月
- 新的管理命令csvinspect从csv文件生成模型
- 一般代码重构
- 管理命令从csvimport重命名为importsv
- 处理错误编码和日期类型的更多功能
版本兼容性
最新版本2.12使用django 2.2和python 3.7.1进行了测试
版本2.6在Python2.7.13和Python3.5.6上分别使用django 1.7、1.8、1.9、1.10、1.11进行了测试
请使用2.1版,例如pip install django csvimport==2.1 对于1.7之前的django版本
此django>;=1.7要求是因为django csvimport对版本>;2.1使用了新添加的appconfig (注意:要解决此问题,可以将django appconf安装到django 1.6或更早版本 并调整csvimport以在csvimport.app中使用它)
对于真正老的django版本<;1.4,您可能需要拨回版本,直到它工作!
请注意,只有>;2.2版与Python3.4兼容
安装说明
将以下内容添加到项目的settings.py中已安装的应用:
>>> pip install django-csvimport ... ... INSTALLED_APPS = ( ... ... ... 'csvimport.app.CSVImportConf', # use AppConfig for django >=1.7 csvimport >=2.2 ... ) ... ... python manage.py migrate (or syncdb if django < 1.9)
注意,migrate的核心表在0001_中,初始迁移表在0002中,所以 rm migrations/0002_test_models.py如果您不想让数据库变得凌乱
自定义命令
检查csv
(pip install messytables以使用此命令)
manage.py inspectcsv importfile.csv>;模型.py
这将返回新模型文件的代码,其中包含CSV文件的猜测模型。 将其添加到应用程序中,然后运行
>>> makemigrations your_app >>> migrate
然后,可以为importfile.csv运行导入到该模型
注意:正如它所说的猜测,您可能需要手动调整生成的models.py以获得 导入以更好地工作。
如果csv文件中没有标题,则它只使用第1列、第2列等自动标题。
导入sv
(请注意,此命令以前是csvimport,但它导致了与模块的名称冲突问题)
manage.py importsv–mappings=''–model='app_label.model_name'–delimiter='t'importfile.csv
对于映射,只在没有标题行的情况下按顺序输入字段列表 使用匹配的字段名-或者您希望覆盖它,例如
–映射='1=共享代码,2=组织(otherapp.organization名称),3=日期'
<在哪里(M)odel外键字段)用于指定关系如果再次需要 覆盖从模型中查找的内容。如果csv文件中没有实名字段,则可以使用 –mappings='无',它将假定字段名为col_1、col_2…等。
注意,如果您有一个标题行并指定了映射,那么它将把标题视为一个数据行,因此请先删除它。
管理界面导入
只需添加一个csvimport项,填写表单并提交。 失败的导入行将添加到日志字段。
演示安装说明
要了解它的工作原理,您可以很容易地安装一个演示程序,例如通过虚拟环境, 然后使用"测试"设置有一些用于导入数据的示例模型,并且设备是示例CSV文件。
- 在外壳中运行以下命令:
>>> virtualenv mysite ... cd mysite ... pip install django ... pip install django-csvimport ... ... cat > bin/django-admin.py << EOF ... #!/usr/bin/env python ... from django.core import management ... import os ... os.environ["DJANGO_SETTINGS_MODULE"] = "csvimport.settings" ... if __name__ == "__main__": ... management.execute_from_command_line() ... EOF ... ... django-admin.py migrate ... django-admin.py runserver
- 在浏览器中转到http://127.0.0.1:8000/admin/" rel="nofollow">http://127.0.0.1:8000/admin/-注意后面的/!
- 单击"添加csvimport"
- 选择django csvimport/csvimport/tests/fixtures/countries.csv[1]并将其上载
- 检查国家/地区型号是否已填充。
[1]也可从 https://raw.github.com/edcrewe/django-importcv/master/importcv/tests/fixtures/countries.csv获得。
django-admin.py importsv–model='csvimport.country'django csvimport/csvimport/tests/fixtures/countries.csv–settings='csvimport.settings'
外键
csvimport无法确定复杂的表关系。 但是,如果它在其模型映射中找到标记为带有查找字段的外键的内容,则会检查相关模型的数据是否已存在,并为该字段收回一个id,或者在fkey模型中创建一个新条目(如果可能),然后收回一个新id。
为了使其有用,您需要一个相关的表,该表具有一个唯一且更有意义的字段,该字段正在您的数据中使用,而不是一个数字主键。
例如,对于一个组织列org,它从一个单独的表中保存组织的唯一名称,您可以添加
column2=组织(组织名称)
到映射,因此它知道org字段与一个单独的组织表相关,该组织表具有一个唯一的name字段,用于查找并替换为org_id fkey
更复杂的关系
对于任何更复杂的关系,例如多个键、多对多个字段等。 建议的方法是创建一个临时或中间导入表,该表保存CSV文件中的数据 使用中的查找数据作为列,可以使用
inspectcsv importfile.csv>;models.py
从CSV文件自动生成导入模型。
每当您对该表进行导入时,您将使用大容量插入数据库查询获取其中的数据,并适当地填充最终模型表的复杂关系。 如果导入重复发生(例如每天一次),则保留导入CSV格式的表,并可以为该表添加数据库触发器,以便自动将存储的数据转换同步查询运行到目标表中。
日期时间数据
请注意,导入程序使用"设置"中的"标准日期输入格式"列表尝试转换CSV文件中的任何日期时间类型。 因此,将此项添加到您的设置中,并列出您要处理的任何格式。
日期输入格式=[%y-%m-%d%h:%m:%s']
以便在1970-2037时区范围之外导入日期 对于某些数据库后端s sqlite有一个django.utils.timezone补丁 使用tzinfo monkeypatch
致谢
这个包裹是作为在英国布里斯托尔奥尼之家举办的Django短跑的一部分而制作的。 丹费尔斯和我当地的django用户组"dbbug"。它是应用程序的核心组件 由HeliOS基金会的Fraser Stephens促成的援助机构供应链共享 由Ed Crewe和Tom Dunham开发。