将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月

  1. 新的管理命令csvinspect从csv文件生成模型
  2. 一般代码重构
  3. 管理命令从csvimport重命名为importsv
  4. 处理错误编码和日期类型的更多功能

版本兼容性

最新版本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开发。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在Android Wifi中筛选相同的SSID?   Java中重写接口中异常处理的泛型   java“无效转义序列(有效的是\b\t\n\f\r\”\“\”\)”语法错误   使用JNDI的java NameReadyBoundException   java如何在这个程序上执行算法   java为什么我的应用程序在调试时崩溃而应用程序停止?   Java:while循环未检测到中断条件,但如果块检测到   java如何快速使用jfreechart创建的折线图   java将输入放入JSTL会话变量,以便稍后在屏幕上显示   java在spring boot中加载外部JAR   java Apache NiFi无法使用ojdbc6连接到Oracle 12c。jar或ojdbc8。罐子   java解释StringToWordVector()Weka的输出   java charAt()找不到符号   使用mpjexpress的java阅读控制台输入