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使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
Python实现的redis分布式锁功能示例
May 29 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
Tensorflow 多线程设置方式
Feb 06 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python openssl模块安装及用法
Dec 06 Python
python中的None与NULL用法说明
May 25 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调用C#开发的dll类库方法
2014/07/28 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python 编程速成(推荐)
2019/04/15 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
英智兴达软件测试笔试题
2016/10/12 面试题
银行领导证婚词
2014/01/11 职场文书
《泉水》教学反思
2014/04/11 职场文书
新郎答谢词
2015/01/04 职场文书
安全温馨提示语大全
2015/07/14 职场文书
运动会3000米加油稿
2015/07/21 职场文书
公司借款担保书
2015/09/22 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记