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算法学习之基数排序实例
Dec 18 Python
python抓取豆瓣图片并自动保存示例学习
Jan 10 Python
python开发环境PyScripter中文乱码问题解决方案
Sep 11 Python
利用Python抓取行政区划码的方法
Nov 28 Python
不可错过的十本Python好书
Jul 06 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python数据库封装实现代码示例解析
Sep 05 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
python本地文件服务器实例教程
May 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
jQuery学习笔记之Helloworld
2010/12/22 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
python基础教程之循环介绍
2014/08/29 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
python实现定时提取实时日志程序
2018/06/22 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
银行员工职业规划范文
2014/01/21 职场文书
《满井游记》教学反思
2014/02/26 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
个人向公司借款协议书
2014/10/09 职场文书
中学生自我评价范文
2015/03/03 职场文书
高考1977观后感
2015/06/04 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
Elasticsearch 数据类型及管理
2022/04/19 Python