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 24 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
python使用super()出现错误解决办法
Aug 14 Python
Python正则表达式知识汇总
Sep 22 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
keras输出预测值和真实值方式
Jun 27 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
Python控制鼠标键盘代码实例
Dec 08 Python
一个入门级python爬虫教程详解
Jan 27 Python
python分分钟绘制精美地图海报
Feb 15 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_SELF的安全问题
2009/09/05 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
Jquery 设置标题的自动翻转
2009/10/03 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
python取余运算符知识点详解
2019/06/27 Python
python如何删除文件中重复的字段
2019/07/16 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
Python turtle库的画笔控制说明
2020/06/28 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
临床医学专业求职信
2014/08/08 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
培训通知
2015/04/17 职场文书
西柏坡观后感
2015/06/08 职场文书
2019年思想汇报
2019/06/20 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python