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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python聊天室实例程序分享
Jan 05 Python
Python 登录网站详解及实例
Apr 11 Python
python机器学习之随机森林(七)
Mar 26 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
python3 pathlib库Path类方法总结
Dec 26 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
python 基于opencv实现高斯平滑
Dec 18 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防注入及开发安全详细解析
2013/08/09 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
jQuery 表格插件整理
2010/04/27 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
简单的js表格操作
2016/09/24 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
详解Python如何生成词云的方法
2018/06/01 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
司机的工作范围及职责
2013/11/13 职场文书
历史专业个人求职信范文
2013/12/07 职场文书
班级聚会策划书
2014/01/16 职场文书
腾讯广告词
2014/03/19 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
环境整治工作方案
2014/05/18 职场文书
普通党员对照检查材料
2014/09/24 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js