Django批量创建Model实例
1.前言:
将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(population script)就非常有必要。
2.代码:
假设在models.py中定义的数据为下面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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如下(仅供参考):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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,将环境变量
1 | '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 = "noopener 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如下)
1 2 3 4 | 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:
然后登陆admin页面查看:
可以看到,数据全部被读入数据库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix