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中bisect的用法
Sep 23 Python
Python删除windows垃圾文件的方法
Jul 14 Python
python实现决策树
Dec 21 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
简单实现python聊天程序
Apr 01 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
set在python里的含义和用法
Jun 24 Python
python修改字典键(key)的方法
Aug 05 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
Python如何根据时间序列数据作图
May 12 Python
基于python实现生成指定大小txt文档
Jul 20 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与SQL注入攻击[二]
2007/04/17 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
微信小程序左右滑动的实现代码
2017/12/15 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
Python解析树及树的遍历
2016/02/03 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
python3中的md5加密实例
2018/05/29 Python
Python实现图像的垂直投影示例
2020/01/17 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python实现播放和录制声音的功能
2020/08/12 Python
德国网上药房:Apotal
2017/04/04 全球购物
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
综合办公室岗位职责
2015/04/11 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
生产车间管理制度
2015/08/04 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
python获取对象信息的实例详解
2021/07/07 Python