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逐行读取文件内容的三种方法
Jan 20 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python实现DES加密解密方法实例详解
Jun 30 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
python3.x实现发送邮件功能
May 22 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
Python lambda表达式用法实例分析
Dec 25 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
使用python爬取抖音app视频的实例代码
Dec 01 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP页面间传递参数实例代码
2008/06/05 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
php密码生成类实例
2014/09/24 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
中英文求职信范文
2014/01/27 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记
无线电通信名词解释
2022/02/18 无线电