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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python中获取对象信息的方法
Apr 27 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
python实现祝福弹窗效果
Apr 07 Python
python的pstuil模块使用方法总结
Jul 26 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
如何获取numpy array前N个最大值
May 14 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实现分页的一个示例
2006/10/09 PHP
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
PHP 实现缩略图
2021/03/09 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python编程之序列操作实例详解
2017/07/22 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
药剂专业毕业生求职信
2014/06/24 职场文书
学习党章的体会
2014/11/07 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
初中地理教学反思
2016/02/19 职场文书
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python