@breakerthb
2016-10-20T02:57:07.000000Z
字数 2989
阅读 1794
Django
Django 数据导入
$ python manage.py shell
In [1]: from article.models import Article
In [3]: Article.objects.create(title="blog of my site", category="blog", content="Today is sunny!")
Out[3]: <Article: blog of my site>
这样就新增了一篇博文,我们查看一下
In [4]: Article.objects.all()
Out[4]: [<Article: blog of my site>, <Article: fwefrfdsf>, <Article: dfasfsda>, <Article: abd>]
还有两种方法(这两种差不多):
>>> blog2 = Blog()
>>> blog2.title = "title 2"
>>> blog2.content = "content 2"
>>> blog2.save()
或者
>>> blog2 = Blog(title="title 2",content="content 2")
>>> blog2.save()
比如我们要导入一个文本,里面是标题、关键字和内容,中间用四个*隔开的,示例如下:
title 1****tag1****content 1
title 2****tag1****content 2
title 3****tag1****content 3
title 4****tag1****content 4
title 5****tag1****content 5
title 6****tag1****content 6
title 7****tag1****content 7
title 8****tag1****content 8
title 9****tag1****content 9
在最外面那个mysite(根目录)下写一个脚本,叫 txt2db.py,把 oldblog.txt 也放在mysite下
#!/usr/bin/env python
#coding:utf-8
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_blog.settings")
from article.models import Article
def main():
try:
with open('input.txt', "r") as fileIn:
for line in fileIn:
line = line.strip()
print(line)
(_title, _tag, _content) = line.split("****", 2)
Article.objects.create(title=_title, category=_tag, content=_content)
except:
print("File open error")
if __name__ == "__main__":
main()
print('Done!')
好了,我们在终端运行它
$python txt2db.py
数据已经全部导入!
django.db.models 中还有一个函数叫 get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有
只要把上面的
Article.objects.create(title=_title, category=_tag, content=_content)
换成下面的就不会重复导入数据了
Article.objects.get_or_create(title=_title, category=_tag, content=_content)
返回值是(BlogObject, True/False) 新建时返回 True, 已经存在时返回 False。
更多数据库API的知识请参见官网文档:QuerySet API
# 用fixture导入
最常见的fixture文件就是用python manage.py dumpdata 导出的文件
$ python manage.py dumpdata > fixture.json
或
$ python manage.py dumpdata article > fixture.json
示例如下:
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}]
你也可以根据自己的models,创建这样的json文件,然后用 python manage.py loaddata fixture.json 导入
$ python manage.py loaddata fixture.json
可以写一个脚本,把要导入的数据转化成 json 文件,这样导入也会更快些!
#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
title,content = line.split('****')
blog = Blog(title=title,content=content)
BlogList.append(blog)
f.close()
Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
main()
print('Done!')
由于Blog.objects.create()每保存一条就执行一次SQL,而bulk_create()是执行一条SQL存入多条数据,做会快很多!当然用列表解析代替 for 循环会更快!!
#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
parts = line.split('****')
BlogList.append(Blog(title=parts[0], content=parts[1]))
f.close()
# 以上四行 也可以用 列表解析 写成下面这样
# BlogList = [Blog(title=line.split('****')[0], content=line.split('****')[1]) for line in f]
Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
main()
print('Done!')
当然也可以利用数据中的导出,再导入的方法,见下一节。