django中models模块为各种数据库提供了统一的api,可根据不一样的业务需求配置数据库。html
models模块开发流程:python
这里主要是介绍models模块,那就不得不提到ORMmysql
ORM : 对象-关系-映射git
django中的增删改查,在orm中转换为create/insert等语句再和各类数据库进行交互,以后,在数据库中获得的数据集等在经过orm转换为python中的数据表sql
orm的任务:shell
优势:
减轻开发人员的工做量,不须要面对因数据库的变动而修改代码数据库
一个模型类在数据库中对应一张表,在模型类中定义的属性,对应表中的一个字段django
from django.db import models class Students(models.Model): # 模型类 # 字段 id = models.AutoField(primary_key=True) # 建立一个自增的主键字段 name = models.CharField(null=False,max_length=20) # 建立一个varchar(20)类型的name且不能为空
django 会为表增长自动给增加的主键列,每一个模型只能有一个主键列,若使用选项设置某属性为主键列后,则django不会再生存默认的主键列。api
属性命名限制:1.遵循标识符规则 2.不容许连续的下划线 |
字段类型:字段的建立session
AutoField | 主键类型,一个根据实际id自动增加的integerField,一般不指定,若不指定,一个主键字段将自动添加到模型中 |
CharField(max_length = 字符长度) | 字符串类型 |
TextField | 大文本字段,通常超过4000使用,(显示的是一个文本域) |
IntegerField | 整数类型 |
DecimalField(max_digits=None,decimal_places=None) | 十进制浮点数类型 max_digits:位数总数 |
FloatField | 浮点数类型 |
BooleanField | true/false 字段,默认的表单控制室checkboxInput |
NullBooleanField | null/true/false |
DateField([auto_now=False,auto_now_add=False]) | 日期类型 auto_now:每次保存对象时,自动设置为当前时间(最后一次修改) |
TimeField | 时间类型,参数和DateField相同 |
DateTimeField | 日期-时间类型,参数和DateField相同 |
FileField | 上传文件的字段 |
ImageField | 继承了FileField全部属性和方法,确保是一个有效的image文件 |
举个栗子:
from django.db import models class Students(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 import models class Students(models.Model): # 字段 id = models.AutoField(primary_key=True) name = models.CharField(null=False,max_length=20) age = models.IntegerField(null=False) gender = models.BooleanField() class Meta: db_table = "students" # 修改为功! ordering = ['id']
栗子果:
mysql> use python_mysql Database changed 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 import models class studentsManager(models.Manager): def get_queryset(self): return super(studentsManager, self).get_queryset().filter(gender=False) # filter() 过滤函数可屡次叠加 class Students(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) class Meta: 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()方法后才与数据库进行交互
两种方法:
注:__init__方法在父类models.Model中被使用,因此咱们建立的对象是空对象。
举个栗子:
from django.db import models class studentsManager(models.Manager): def get_queryset(self): return super(studentsManager, self).get_queryset().filter(gender=False) # filter() 过滤函数可屡次叠加 # 管理器中建立对象 def createStudent1(self, sname, sage, sgender): # stu1 = Students() # 只能建立students类的属性,如有外键就不通用勒 stu1 = self.model() # 类型:'my_inn.models.Students' stu1.name = sname stu1.age = sage stu1.gender = sgender return stu1 class Students(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) class Meta: db_table = "students" ordering = ['id'] # 定义一个类方法建立对象 @classmethod def createStudent(cls, sname, sage, sgender): stu = cls(name=sname, age=sage,gender=sgender) return stu
对应的在views.py中的函数操做:
from django.shortcuts import render,redirect,HttpResponse from my_inn import models def 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('...')