django中models模块为各类数据库提供了统一的api,可根据不同的业务需求配置数据库。

models模块开发流程:

定义模型类: 一个模型类在数据库中对应一张数据表

生成迁移文件

执行迁移文件生成数据表

使用模型类进行增删改查

这里主要是介绍models模块,那就不得不提到ORM

ORM : 对象-关系-映射


django中的增删改查,在orm中转换为create/insert等语句再和各种数据库进行交互,之后,在数据库中得到的数据集等在通过orm转换为python中的数据表

orm的任务:

根据对象的类型生成表结构

将对象、列表的操作转换为sql语句

将sql语句查询到的结构转换为对象、列表

优点:

减轻开发人员的工作量,不需要面对因数据库的变更而修改代码

一个模型类在数据库中对应一张表,在模型类中定义的属性,对应表中的一个字段

from django.db importmodels
classStudents(models.Model): # 模型类#字段
id = models.AutoField(primary_key=True) #创建一个自增的主键字段
name = models.CharField(null=False,max_length=20) #创建一个varchar(20)类型的name且不能为空

django 会为表增加自动给增长的主键列,每个模型只能有一个主键列,若使用选项设置某属性为主键列后,则django不会再生存默认的主键列。

属性命名限制:1.遵循标识符规则 2.不允许连续的下划线

字段类型:字段的创建

AutoField

主键类型,一个根据实际id自动增长的integerField,通常不指定,若不指定,一个主键字段将自动添加到模型中

CharField(max_length = 字符长度)

字符串类型

TextField

大文本字段,一般超过4000使用,(显示的是一个文本域)

IntegerField

整数类型

DecimalField(max_digits=None,decimal_places=None)

十进制浮点数类型

max_digits:位数总数

decimal_places:小数点后的数字位数

FloatField

浮点数类型

BooleanField
true/false 字段,默认的表单控制室checkboxInput
NullBooleanField
null/true/false
DateField([auto_now=False,auto_now_add=False])

日期类型

auto_now:每次保存对象时,自动设置为当前时间(最后一次修改)

auto_now_add:每次对象被创建时,被自动设置为当前时间(第一次创建)

auto_now,anto_now_add,default 不能同时被设置

TimeField

时间类型,参数和DateField相同

DateTimeField

日期-时间类型,参数和DateField相同

FileField

上传文件的字段

ImageField

继承了FileField所有属性和方法,确保是一个有效的image文件

举个栗子:

from django.db importmodelsclassStudents(models.Model):#字段
id = models.AutoField(primary_key=True) #创建一个自增的主键字段
name = models.CharField(null=False,max_length=20) #创建一个varchar(20)类型的name且不能为空
age =models.IntegerField()
gender= models.BooleanField()


字段选项:对字段进行的约束

null

设置为true,存入空值到数据库,默认为false,数据库范畴

blank

设为true ,该字段允许为空白,默认为false,表单验证范畴

db_column

设置字段的名称,若字段名未指定,则使用设置的属性名称

db_index

设为true,表会为此字段创建索引

default

设置为默认值

primary_key

设置为true ,则该字段会成为模型的主键

unique

设置为true ,这个字段在表中必须有唯一值

数据表间的关系

ForeignKey

一对多(常用)将字段定义在多的端中

ManyToManyField

多对多,将字段定义在两端中

OneToOneField

一对一,将字段定义在任意一端中

举个栗子:

sgrade = models.ForeignKey("Grades")

元选项:在模型类中定义Meta类,用于设置元信息(对数据库中具体数据的操作(表级操作)例:排序)

例:db_table:定义数据表名,若不定义,则数据表名默认为:项目名小写_类名小写

ordering:默认排序字段,获取列表时使用  ordering['id']:升序 ordering['-id']:降序

举个栗子:

from django.db importmodelsclassStudents(models.Model):#字段
id = models.AutoField(primary_key=True)
name= models.CharField(null=False,max_length=20)
age= models.IntegerField(null=False)
gender=models.BooleanField()classMeta:
db_table= "students" # 修改成功!ordering= ['id']

栗子果:

mysql> usepython_mysqlDatabasechanged
mysql>show tables;+----------------------------+
| Tables_in_python_mysql |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
|students |
+----------------------------+

模型成员

模型的类属性:

当模型类没有指定管理器,django则为模型创建一个名为objects的管理器,用于和数据库进行交互(即django模型与数据库交互的接口)

自定义模型管理器:

stuObj = models.Manager()  # 自定义的模型管理器(貌似没什么luan用)

更深入的就是自定义模型管理器类(Manager()类):

from django.db importmodelsclass studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager, self).get_queryset().filter(gender=False)
# filter() 过滤函数可多次叠加
classStudents(models.Model):
stuObj= models.Manager() #自定义的模型管理器
stuObj1 =studentsManager()
id= models.AutoField(primary_key=True)
name= models.CharField(null=False,max_length=20)
age= models.IntegerField(null=False)
gender= models.BooleanField(default=True)classMeta:
db_table= "students"ordering= ['id']
可在terminal中验证:
>>python manage.py shell     # 进入python环境
>>>from my_inn.models import Students;
>>>Students.stuObj1.all();
>>>Students.stuObj.all();        # 可作结果对比

模型的创建对象

目的:向数据库中添加数据,当创建对象时,django不会对数据进行读写操作,只有调用save()方法后才与数据库进行交互

两种方法:

在模型类中增加一个类方法(方法上加上@staticmethod)(即在models 创建表的类下添加方法)

在定义管理器中添加一个方法(即在models 中studentsManager管理器中添加方法)

注:__init__方法在父类models.Model中被使用,所以我们创建的对象是空对象。

举个栗子:



from django.db importmodelsclassstudentsManager(models.Manager):defget_queryset(self):return super(studentsManager, self).get_queryset().filter(gender=False)#filter() 过滤函数可多次叠加

#管理器中创建对象

defcreateStudent1(self, sname, sage, sgender):#stu1 = Students() # 只能创建students类的属性,若有外键就不通用勒
stu1 = self.model() #类型:'my_inn.models.Students'
stu1.name =sname
stu1.age=sage
stu1.gender=sgenderreturnstu1classStudents(models.Model):
stuObj= models.Manager() #自定义的模型管理器
stuObj1 =studentsManager()#字段
id = models.AutoField(primary_key=True)
name= models.CharField(null=False,max_length=20)
age= models.IntegerField(null=False)
gender= models.BooleanField(default=True)classMeta:
db_table= "students"ordering= ['id']#定义一个类方法创建对象
@classmethoddefcreateStudent(cls, sname, sage, sgender):
stu= cls(name=sname, age=sage,gender=sgender)return stu
models.py

对应的在views.py中的函数操作:


from django.shortcuts importrender,redirect,HttpResponsefrom my_inn importmodelsdef addstudent(request): #类方法创建对象
stu = Students.createStudent('nini',22,0)
stu.save()#更新数据库
return HttpResponse('...')def addstudent1(request): #管理器创建对象
stu = Students.stuObj1.createStudent('nili',23,1)
stu.save()#更新数据库
return HttpResponse('...')
Views.py