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用来获得图片exif信息的库实例分析
Mar 16 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
python编写俄罗斯方块
Mar 13 Python
python制作一个简单的gui 数据库查询界面
Nov 19 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获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
Python数组遍历的简单实现方法小结
2016/04/27 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python多线程http压力测试脚本
2019/06/25 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
python爬取微博评论的实例讲解
2021/01/15 Python
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
医药代表个人求职信范本
2013/12/19 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
个人党性分析材料
2014/12/19 职场文书
担保贷款承诺书
2015/04/30 职场文书
民事代理词范文
2015/05/25 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python