Django如何批量创建Model


Posted in Python onSeptember 01, 2020

1.前言:

将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(population script)就非常有必要。

2.代码:

假设在models.py中定义的数据为下面:

from django.db import models
 
# Create your models here.
class Category(models.Model):
  name=models.CharField(max_length=128,unique=True)
  class Meta:
    verbose_name_plural="Categories"
  def __str__(self):
    return self.name
 
class Page(models.Model):
  category=models.ForeignKey(Category,on_delete=models.CASCADE)
  title=models.CharField(max_length=128)
  url=models.URLField()
  views=models.IntegerField(default=0)
  def __str__(self):
    return self.title

populate.py如下(仅供参考):

import os
# In your live server environment, you'll need to tell your WSGI application what settings
# file to use. Do that with os.environ:
#reference source:https://docs.djangoproject.com/en/3.1/topics/settings/
os.environ.setdefault('DJANGO_SETTINGS_MODULE','tango_with_django_project.settings')
 
import django
django.setup()
from rango.models import Category,Page
#If you're using components of Django “standalone” ? for example, writing a Python script
# which loads some Django templates and renders them, or uses the ORM to fetch some data ?
# there's one more step you'll need in addition to configuring settings.
# After you've either set DJANGO_SETTINGS_MODULE or called configure(), you'll need to call
# django.setup() to load your settings and populate Django's application registry.
# reference source:https://docs.djangoproject.com/en/3.1/topics/settings/
def populate():
  python_pages=[
    {"title":"official",
    "url":"http://docs.python.org"},
    {"title":"How to think like a computer scientis",
    "url":"http://ww.greenteapress.com/thinkpy"},
    {"title":"learn python in 10 minites",
    "url":"http://www.korokithakis.net/tutorials/python"}
  ]
 
  django_pages=[
    {"title":"Official Django tutorial",
    "url":"https://docs.jangoproject.com/en/1.9/intro"},
    {"title":"Django Rocks",
    "url":"http://www.djangorocks.com"
    },
    {"title":"HOw to tango with django",
    "url":"http://www.tangowithdjango.com"}
  ]
 
  other_pages=[
    {"title":"Bottle",
    "url":"http://bottlepy.org"},
    {"title":"Flask",
    "url":"http://flask.pocoo.org"},
    {"title":"Bold test",
    "url":"http://boldtest.org"}
  ]
  cats={"Python":{"pages":python_pages},
  "Django":{"pages":django_pages},
  "Other Frameworks":{"pages":other_pages}}
 
  def add_page(cat,title,url,views=0):
    p=Page.objects.get_or_create(category=cat,title=title,url=url,views=views)[0]
    # p.url=url
    # p.views=views
    p.save()
    return p
  def add_cat(name):
    c=Category.objects.get_or_create(name=name)[0]
    c.save()
    return c
  for cat,cat_data in cats.items():
    c=add_cat(cat)
    for p in cat_data['pages']:
      add_page(c,p["title"],p['url'])
  for c in Category.objects.all():
    for p in Page.objects.filter(category=c):
      print("-{0}-{1}".format(str(c),str(p)))
 
if __name__=="__main__":
  print("starting rango population script")
  populate()

 3.代码要点

(1)在独立运行django的代码时,而不是通过 python manage.py runserver的方式运行时,必须使用django.setup()来引入Django项目的设置,而在引入设置之前还要指明 环境变量DJANGO_SETTINGS_MODULE用的是本项目的settings。

设置环境变量在python中常用os.environ,它返回一个字典类型,里面包含了所有环境变量的键值对,所以在这里使用字典的内置方法setdefault,将环境变量

'DJANGO_SETTINGS_MODULE' 设置为'tango_with_django_project.settings'(本项目的settings.py)。<br>参考:<a href="https://docs.djangoproject.com/en/3.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE" rel="external nofollow" >https://docs.djangoproject.com/en/3.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE</a>

(2)get_or_create方法:(官方文档定义https://docs.djangoproject.com/en/3.1/ref/models/querysets/#get-or-create如下)

get_or_create(defaults=None, **kwargs)
A convenience method for looking up an object with the given kwargs (may be empty if your model has defaults for all fields),<br> creating one if necessary.
Returns a tuple of (object, created), where object is the retrieved or created object and created is a boolean specifying whether a new <br>object was created.
This is meant to prevent duplicate objects from being created when requests are made in parallel, and as a shortcut to boilerplatish code. <br>

 在这里,需要注意的是,如果在创建model instance时,仅在model有默认值的情况下可以不输入任何kwargs,否则必须至少输入一个值(field,如这里page的category,或者Category的name),然后该方法会带着这个值先去找有没有该值下的model instance,如果没有则创建一个新的,返回(object,created),这里object 是新创建的对象的reference,created为True.

4.运行查看

运行python populate.py:

Django如何批量创建Model

然后登陆admin页面查看:

Django如何批量创建Model

可以看到,数据全部被读入数据库。

以上就是Django如何批量创建Model的详细内容,更多关于Django批量创建Model的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python制作爬虫爬取京东商品评论教程
Dec 16 Python
SQLite3中文编码 Python的实现
Jan 11 Python
python读取和保存视频文件
Apr 16 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
Python利用递归实现文件的复制方法
Oct 27 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
django使用多个数据库的方法实例
Mar 04 Python
怎么用Python识别手势数字
Jun 07 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 #Python
一文详述 Python 中的 property 语法
Sep 01 #Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 #Python
聊聊python中的异常嵌套
Sep 01 #Python
理解Django 中Call Stack机制的小Demo
Sep 01 #Python
如何快速理解python的垃圾回收机制
Sep 01 #Python
Python Opencv图像处理基本操作代码详解
Aug 31 #Python
You might like
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
Python装饰器用法实例总结
2018/02/07 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
简历中的自我评价怎么写
2014/01/29 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
机电系毕业生求职信
2014/07/11 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
基层党员对照检查材料
2014/08/25 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
参观邀请函范文
2015/02/02 职场文书
国博复兴之路观后感
2015/06/02 职场文书
2016年教师新年寄语
2015/08/18 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python