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中装饰器的用法
Apr 27 Python
Django实现快速分页的方法实例
Oct 22 Python
python3大文件解压和基本操作
Dec 15 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
Mac安装python3的方法步骤
Aug 09 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
django序列化时使用外键的真实值操作
Jul 15 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 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
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
Python数据类型详解(四)字典:dict
2016/05/12 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
python自动裁剪图像代码分享
2017/11/25 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
python 实现多线程下载视频的代码
2019/11/15 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
怎么写自荐书范文
2014/02/12 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
党支部季度考核意见
2015/06/02 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android