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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
python实现爬虫下载漫画示例
Feb 16 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
详解Django中间件执行顺序
Jul 16 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
Django REST Swagger实现指定api参数
Jul 07 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 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系列学习之日期函数使用介绍
2012/08/18 PHP
php程序内部post数据的方法
2015/03/31 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
npm qs模块使用详解
2020/02/07 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
遗传算法python版
2018/03/19 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
python定时截屏实现
2020/11/02 Python
python3代码中实现加法重载的实例
2020/12/03 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
销售高级职员求职信
2013/10/29 职场文书
医大实习自我鉴定
2013/12/07 职场文书
办理退休介绍信
2014/01/09 职场文书
读书小明星事迹材料
2014/05/03 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
企业领导对照检查材料
2014/08/20 职场文书
十佳青年事迹材料
2014/08/21 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis