目录
零之前言
一.创建完整模型
1.创建模型框架
2.创建模型字段
①字段类型
②字段选项
③关系
④访问
二.模型的使用
1.增
2.删
3.查
①返回查询集(过滤器):
②返回单个数据:
③限制查询集:
④使用:
4.改
三.后记
零之前言
个人理解的model是django里的一种数据库的抽象。
它通过一种类的形式去对应了数据库一张表格。相当于对一张表进行了封装。
无论是你是使用哪种数据库,Django中model的代码基本上可以不需要改变,只需要修改使用的数据库类型,django可以通过migration把你的model映射为那一张表格。你也可以减少使用原生的数据库代码去操作数据库。
而且,创建模型的前提是:你需要在Django上配置好你的数据库。
一.创建完整模型
1.创建模型框架
首先进入我们的app/models.py里,载入我们的models。(芮然models.py 已经帮我们写好了)
from django.db import models
然后新建一个类,该类继承了我们django提供的模型,类名就是我们的模型名:
class Test_model(models.Model):
并且在该类下面定义一个Meta类,用于设置元信息,比如表的名字和默认排序的方式
class Meta:
db_table = xxx 定义数据表名,推荐使用小写字母
ordering =['id']
一般我们结构如下就行了:
class Account(models.Model):
class Meta:
db_table = 'namedb'
2.创建模型字段
①字段类型
以下是字段类型:类似于我们的表里数据的类型
- AutoField
一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中 - CharField(max_length=字符长度)
字符串,默认的表单样式是 TextInput - TextField
大文本字段,一般超过4000使用,默认的表单控件是Textarea - IntegerField
整数 - DecimalField(max_digits=None, decimal_places=None)
使用python的Decimal实例表示的十进制浮点数。
参数说明:DecimalField.max_digits = 位数总数;DecimalField.decimal_places = 小数点后的数字位数 - FloatField
用Python的float实例来表示的浮点数 - BooleanField
true/false 字段,此字段的默认表单控制是CheckboxInput - NullBooleanField
支持null、true、false三种值 - DateField([auto_now=False, auto_now_add=False])
使用Python的datetime.date实例表示的日期。
参数说明:DateField.auto_now = 每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false; DateField.auto_now_add = 当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
说明:该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键。
注意:auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。 - TimeField
使用Python的datetime.time实例表示的时间,参数同DateField。 - DateTimeField
使用Python的datetime.datetime实例表示的日期和时间,参数同DateField - FileField
一个上传文件的字段 - ImageField
继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
②字段选项
通过字段选项,可以实现对字段的约束。
- null
如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False - blank
如果为True,则该字段允许为空白,默认值是 False。 - 注意:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column
字段的名称,如果未指定,则使用属性的名称 - db_index
若值为 True, 则在表中会为此字段创建索引 - default
默认值 - primary_key
若为 True, 则该字段会成为模型的主键字段 - unique
如果为 True, 这个字段在表中必须有唯一值
③关系
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
④访问
- 用一访问多:
对象.模型类小写_set 例如:grade.students_set - 用一访问一:
对象.模型类小写 例如:grade.students - 访问id:
对象.属性_id 例如student.sgrade_id
二.模型的使用
一般我们的模型都是在Views里面使用。
1.增
def welcome(request):
a = Account() #实例化对象,并接下来赋值
a.acc_password = 'a'
a.acc_password = 'b'
a.save() #保存对象
return HttpResponse("ok")
2.删
逻辑删除:删除一般不用物理删除,而是使用逻辑删除。比如我们可以给模型增加一个BooleanField字段,通过判断T/F来判断是否删除。
物理删除:调用delete方法即可
a.delete()
3.查
查询的方法有多重,一般是先通过过滤器来获得一个过滤集,然后再来获取,写成链式调用。
①返回查询集(过滤器):
- all() 返回所有数据
- filter() 返回符合条件的数据
- exclude() 过滤掉符合条件的数据
- order_by() 排序
- values() 一条数据就是一个字典,返回一个列表
②返回单个数据:
- get():慎用!返回一个满足条件的对象
如果没有找到符合条件的对象,会引发 模型类.DoesNotExist异常
如果找到多个,会引发 模型类.MultiObjectsReturned 异常 - first():返回查询集中的第一个对象
- last():返回查询集中的最后一个对象
- count():返回当前查询集中的对象个数
- exists():判断查询集中是否有数据,如果有数据返回True没有反之
③限制查询集:
可以使用下标的方法进行限制
studentList = Student.objects.all()[0:5] 下标不能是负数
④使用:
一般我们可以通过filter()的级联来限制查询条件,然后通过exists()是否存在来判断有无数据。若是有对数据的唯一要求我们还可以通过count()来判断个数。
假设我们要做登录,我们已经确保了用户ID是唯一的了,那么我们还是通过级联filter的方式来选择存在的用户,然后将用户权限和名字写进cookies里
users = Account.objects.filter(acc_password=uword).filter(acc_name=uname)
if users.exists():
res = HttpResponseRedirect(reverse("app:welcome"))
res.set_cookie('username', uname)
res.set_cookie('userkey', users[0].acc_permission)
return res
4.改
改就不必赘述,查询到了修改字段的内容,然后Save()就行了
三.后记
差不多对模型的基础操作用这么多就够了,如果需要了解更多,可以更深入的了解。