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 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
Python中使用ElementTree解析XML示例
Jun 02 Python
python实现随机梯度下降法
Mar 24 Python
利用python修改json文件的value方法
Dec 31 Python
基于Python函数和变量名解析
Jul 19 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
opencv 分类白天与夜景视频的方法
Jun 05 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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递归创建和删除文件夹的代码小结
2012/04/13 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Django实现内容缓存实例方法
2020/06/30 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
教师自我鉴定
2013/12/13 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
建筑工地质量标语
2014/06/12 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
自我检讨书范文
2015/01/28 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
nginx 添加http_stub_status_module模块
2022/05/25 Servers
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL