Django如何批量创建Model
1.前言:
将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(populationscript)就非常有必要。
2.代码:
假设在models.py中定义的数据为下面:
fromdjango.dbimportmodels #Createyourmodelshere. classCategory(models.Model): name=models.CharField(max_length=128,unique=True) classMeta: verbose_name_plural="Categories" def__str__(self): returnself.name classPage(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): returnself.title
populate.py如下(仅供参考):
importos #Inyourliveserverenvironment,you'llneedtotellyourWSGIapplicationwhatsettings #filetouse.Dothatwithos.environ: #referencesource:https://docs.djangoproject.com/en/3.1/topics/settings/ os.environ.setdefault('DJANGO_SETTINGS_MODULE','tango_with_django_project.settings') importdjango django.setup() fromrango.modelsimportCategory,Page #Ifyou'reusingcomponentsofDjango“standalone”–forexample,writingaPythonscript #whichloadssomeDjangotemplatesandrendersthem,orusestheORMtofetchsomedata– #there'sonemorestepyou'llneedinadditiontoconfiguringsettings. #Afteryou'veeithersetDJANGO_SETTINGS_MODULEorcalledconfigure(),you'llneedtocall #django.setup()toloadyoursettingsandpopulateDjango'sapplicationregistry. #referencesource:https://docs.djangoproject.com/en/3.1/topics/settings/ defpopulate(): python_pages=[ {"title":"official", "url":"http://docs.python.org"}, {"title":"Howtothinklikeacomputerscientis", "url":"http://ww.greenteapress.com/thinkpy"}, {"title":"learnpythonin10minites", "url":"http://www.korokithakis.net/tutorials/python"} ] django_pages=[ {"title":"OfficialDjangotutorial", "url":"https://docs.jangoproject.com/en/1.9/intro"}, {"title":"DjangoRocks", "url":"http://www.djangorocks.com" }, {"title":"HOwtotangowithdjango", "url":"http://www.tangowithdjango.com"} ] other_pages=[ {"title":"Bottle", "url":"http://bottlepy.org"}, {"title":"Flask", "url":"http://flask.pocoo.org"}, {"title":"Boldtest", "url":"http://boldtest.org"} ] cats={"Python":{"pages":python_pages}, "Django":{"pages":django_pages}, "OtherFrameworks":{"pages":other_pages}} defadd_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() returnp defadd_cat(name): c=Category.objects.get_or_create(name=name)[0] c.save() returnc forcat,cat_dataincats.items(): c=add_cat(cat) forpincat_data['pages']: add_page(c,p["title"],p['url']) forcinCategory.objects.all(): forpinPage.objects.filter(category=c): print("-{0}-{1}".format(str(c),str(p))) if__name__=="__main__": print("startingrangopopulationscript") populate()
3.代码要点
(1)在独立运行django的代码时,而不是通过pythonmanage.pyrunserver的方式运行时,必须使用django.setup()来引入Django项目的设置,而在引入设置之前还要指明环境变量DJANGO_SETTINGS_MODULE用的是本项目的settings。
设置环境变量在python中常用os.environ,它返回一个字典类型,里面包含了所有环境变量的键值对,所以在这里使用字典的内置方法setdefault,将环境变量
'DJANGO_SETTINGS_MODULE'设置为'tango_with_django_project.settings'(本项目的settings.py)。
参考:https://docs.djangoproject.com/en/3.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE
(2)get_or_create方法:(官方文档定义https://docs.djangoproject.com/en/3.1/ref/models/querysets/#get-or-create如下)
get_or_create(defaults=None,**kwargs) Aconveniencemethodforlookingupanobjectwiththegivenkwargs(maybeemptyifyourmodelhasdefaultsforallfields),
creatingoneifnecessary. Returnsatupleof(object,created),whereobjectistheretrievedorcreatedobjectandcreatedisabooleanspecifyingwhetheranew
objectwascreated. Thisismeanttopreventduplicateobjectsfrombeingcreatedwhenrequestsaremadeinparallel,andasashortcuttoboilerplatishcode.
在这里,需要注意的是,如果在创建modelinstance时,仅在model有默认值的情况下可以不输入任何kwargs,否则必须至少输入一个值(field,如这里page的category,或者Category的name),然后该方法会带着这个值先去找有没有该值下的modelinstance,如果没有则创建一个新的,返回(object,created),这里object是新创建的对象的reference,created为True.
4.运行查看
运行pythonpopulate.py:
然后登陆admin页面查看:
可以看到,数据全部被读入数据库。
以上就是Django如何批量创建Model的详细内容,更多关于Django批量创建Model的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。