Django如何批量創(chuàng)建Model
1.前言:
將測試數(shù)據(jù)全部敲入數(shù)據(jù)庫非常繁瑣,而且如果與合作伙伴一起開發(fā),部署,那么他們肯定也不想把時間花在一個一個錄入數(shù)據(jù)的繁瑣過程中,這時候,創(chuàng)建一個批量錄入數(shù)據(jù)的腳本(population script)就非常有必要。
2.代碼:
假設(shè)在models.py中定義的數(shù)據(jù)為下面:
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.代碼要點(diǎn)
(1)在獨(dú)立運(yùn)行django的代碼時,而不是通過 python manage.py runserver的方式運(yùn)行時,必須使用django.setup()來引入Django項(xiàng)目的設(shè)置,而在引入設(shè)置之前還要指明 環(huán)境變量DJANGO_SETTINGS_MODULE用的是本項(xiàng)目的settings。
設(shè)置環(huán)境變量在python中常用os.environ,它返回一個字典類型,里面包含了所有環(huán)境變量的鍵值對,所以在這里使用字典的內(nèi)置方法setdefault,將環(huán)境變量
'DJANGO_SETTINGS_MODULE' 設(shè)置為'tango_with_django_project.settings'(本項(xiàng)目的settings.py)。<br>參考:<a 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>
在這里,需要注意的是,如果在創(chuàng)建model instance時,僅在model有默認(rèn)值的情況下可以不輸入任何kwargs,否則必須至少輸入一個值(field,如這里page的category,或者Category的name),然后該方法會帶著這個值先去找有沒有該值下的model instance,如果沒有則創(chuàng)建一個新的,返回(object,created),這里object 是新創(chuàng)建的對象的reference,created為True.
4.運(yùn)行查看
運(yùn)行python populate.py:

然后登陸admin頁面查看:

可以看到,數(shù)據(jù)全部被讀入數(shù)據(jù)庫。
以上就是Django如何批量創(chuàng)建Model的詳細(xì)內(nèi)容,更多關(guān)于Django批量創(chuàng)建Model的資料請關(guān)注腳本之家其它相關(guān)文章!
- django model object序列化實(shí)例
- Django model序列化為json的方法示例
- 詳解django的serializer序列化model幾種方法
- Django model重寫save方法及update踩坑詳解
- django Model層常用驗(yàn)證器及自定義驗(yàn)證器詳解
- django models里數(shù)據(jù)表插入數(shù)據(jù)id自增操作
- Django更新models數(shù)據(jù)庫結(jié)構(gòu)步驟
- django實(shí)現(xiàn)將后臺model對象轉(zhuǎn)換成json對象并傳遞給前端jquery
- 通過代碼簡單了解django model序列化作用
相關(guān)文章
Pandas實(shí)現(xiàn)聚合運(yùn)算agg()的示例代碼
在數(shù)據(jù)分析中,分組聚合二者缺一不可。對數(shù)據(jù)聚合(求和、平均值等)通常是不可避免的。pd.agg()很方便進(jìn)行聚合操作。本文就來介紹一下,感興趣的可以了解一下2021-07-07
python for循環(huán)remove同一個list過程解析
這篇文章主要介紹了python for循環(huán)remove同一個list過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實(shí)例代碼
先前學(xué)習(xí)過,數(shù)字和字符串都可以存儲到變量當(dāng)中,下面這篇文章主要給大家介紹了關(guān)于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
磁盤垃圾文件清理器python代碼實(shí)現(xiàn)
幾行Python代碼打造自己的磁盤垃圾文件清理器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
OpenCV半小時掌握基本操作之像素加減乘除&邏輯運(yùn)算
這篇文章主要介紹了OpenCV基本操作之像素加減乘除&邏輯運(yùn)算,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
使用PyCharm進(jìn)行遠(yuǎn)程開發(fā)和調(diào)試的實(shí)現(xiàn)
這篇文章主要介紹了使用PyCharm進(jìn)行遠(yuǎn)程開發(fā)和調(diào)試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
python生成器/yield協(xié)程/gevent寫簡單的圖片下載器功能示例
這篇文章主要介紹了python生成器/yield協(xié)程/gevent寫簡單的圖片下載器功能,結(jié)合實(shí)例形式分析了python生成器、yield協(xié)程與gevent圖片下載器相關(guān)功能定義與使用技巧,需要的朋友可以參考下2019-10-10

