django模型

对于数据驱动的Web系统,数据库表的设计完成,就相当于Web系统已经完成了一半,可见数据库表的设计难度以及在Web开发中的重要性

设计系统表:

Django提供了完善的模型(model)层来创建和存取数据,它包含你所储存的必要字段和行为,通常每个模型对应数据库中唯一的一张表,模型避免了我们直接对数据库的操作,Django模型基础知识:

1、每个模型是一个Python类,继承django.db.models.Model类  2、该模型的每个属性表示一个数据库字段  3、所有这一切已经给了你一个自动生成的数据库访问的API

打开sign/models.py文件,通过模型完成表的创建

当模型创建好以后,执行数据库迁移

 

admin后台管理:

通过admin后台管理用户/用户组非常方便,创建的发布会和嘉宾表同样可以通过admin后台管理,打开/sign/admin.py,添加如下代码:

这些代码通知Admin管理工具为这些模块逐一提供界面,启动服务python manage.py runserver,登录admin后台:http://127.0.0.1:8000/admin,输入用户名admin和密码sun123456!,点击Log in,跳转到如下页面:

单击Events对应的Add,添加一条发布会信息,弹出如下页面:

正确填写和勾选,Time点击Now会显示当前的时间,点击SAVE,弹出下面的页面,显示的是一条发布会信息,默认只有发布会名称,这与创建model时设置的__str__()方法有关,默认返回self.name,即发布会名称联想手机发布会

如何才能显示表中的更多字段呢,继续修改/sign/admin.py文件,Django提供了大量选项让你针对特别的模块自定义管理工具,这些选项都在ModelAdmin类中,创建EventAdmin类ModelAdmin,这里只自定义一项:list_display,它是一个字段名称的数组,用于定义要在列表中显示哪些字段,这些字段名称必须是模型中的Event()类中所定义的,如下:

修改admin.site.register()方法,添加EventAdmin类,可以这样理解,用EventAdmin选项注册Event模块,对于Guest模块来说,操作步骤同上,保存修改的代码,重新刷新Events列表,如下图所示:

单击Guests对应的Add,添加一条嘉宾信息,进入Add guest页面,Event选择砂锅面添加的联想手机发布会,Realname,Phone,Email正常填写,勾选Sign,点击Save按钮,如下图所示:

除此之外,还可以快速地生成搜索栏和过滤器,重新打开/sign/admin.py文件,做如下修改:

刷新页面,可以看到搜索栏和过滤器,如下图红框:

基本数据访问:

当需要操作数据库时,不再需要通过sql语句,django自动为这些模型提供了高级的python api,接下来练习数据库表的操作,运行manage.py提供的shell命令

在cmd.exe或Terminal下输入python manage.py shell,会显示python版本,该shell模式为django特别定制,在该模式下可以操作django模型,输入from sign.models import Event, Guest回车,再输入Event.objects.all(),如下图所示:

from sign.models import Event, Guest 导入sign应用下Model中的Event类和Guest类,table.objects.all(),获得table(即Event和Guest)中的所有对象

插入数据:

在cmd.exe下启动服务,在Terminal下输入from datetime import datetime回车,因为start_time字段需要设置日期时间,所以先导入datetime.datetime()

再输入e1 = Event(id=2,name='OPPO R11 Plus手机发布会',limit=200,status=True,address='北京国贸大饭店',start_time=datetime(2019,7,10,14,35,5))回车,再输入e1.save(),当通过save()方法保存插入的数据时,我们收到了一行警告信息,"RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2019-07-10 14:35:05) while time zone support is active.",这跟UTC有关,这里选择忽略掉这个问题,最简单的方式就是在/settings.py文件中设置:USE_TZ=False(第115行,默认是True),修改settings.py文件并保存,需要执行quit()命令推出shell模式,并重新执行python manage.py shell进入,刚才的设置才会生效,然后执行from sign.models import Event, Guest回车,再次执行插入数据的步骤,看看警告信息是不是不见了,事实证明确实没有警告了,通过Event.objects.all()可以看到后插入的两条数据,如下图所示:

如果你觉得创建和保存分两步完成过于麻烦,也可以通过table.objects.create()方法将两步合为一步,方法如下:

需要说明的是,表的id字段已经设置了自增,所以创建表数据时,可以不用指定id字段,但在创建嘉宾数据时需要指定关联的发布会id,Event表指定id=4,Guest表指定event_id=4,所以嘉宾'tim'对应的是'红米MAX发布会',通过url查看表数据如下:

把event换成guest,即http://127.0.0.1:8000/admin/sign/guest/可以看到插入成功的guest

查询数据:

查询无疑是数据库表中使用频率最高的操作,table.objects.get()方法用于从数据库表中取得一条匹配的结果,返回一个对象,如果记录不存在的话,那么它会报DoesNotExist类型错误,通过name='红米MAX发布会'作为查询条件,查询如下:

因为name='发布会'并没有完全匹配到发布会名称,所以会抛出DoesNotExist异常,但更多的时候我们会使用模糊查询,table.objects.filter()方法是从数据库取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回空列表[]

name为发布会的字段名,在name和contains之间用双下划线连接,这里的contains部分会被django翻译成sql语句中的like语句,接下来通过嘉宾查询其关联的发布会信息,查询phone='15810598409'这位嘉宾所参加的发布会的名称和地址

删除数据:

查询phone='15810598409'的嘉宾,通过delete()方法删除,如下图所示的方法或Guest.objects.get(phone='13800138000').delete()来删除

更新数据:

查询phone='15810598409'的嘉宾,更新realname='manu',或者直接通过update()方法更新查询结果,两种方法都可以实现,第二种方法更新成功了返回1

配置MySQL,创建guest库,用于我们开发的发布会签到项目

 

在django中配置MySQL:

django如何连接MySQL数据库呢?在/guest/settings.py文件中修改数据库配置就可以了

重新执行数据库同步,使数据模型重新在MySQL数据库中生成表,python manage.py migrate,报错了django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb',这是因为django在连接MySQL数据库时默认使用的MySQLdb驱动,然而我们并没有安装MySQLdb驱动,它不支持python3,现在使用的时pymysql驱动,如何让当前的django通过pymysql来连接MySQL数据库呢?打开/guest/__init__.py文件,该文件默认是一个空文件,添加配置如下:

重新执行数据库同步,python manage.py migrate,产生一个警告,其他都OK,书上没有警告

因为更换了数据库,所以Admin后台超级管理员账号也需要重新创建,python manage.py createsuperuser,username:admin,Email:174596537@qq.com,password:sun123456!,如下图所示:

可以在guest数据库里面看见12个表

新建的数据库,里面的表只有字段,没有数据,可以在页面上添加,也可以在表里插入数据,也可以暂时不添加需要时再添加

转载于:https://www.cnblogs.com/laosun0204/p/11038108.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值