1、Django为各种数据库提供了很好的支持,为这些数据库提供了统一的API,可以根据不同的需求选择不同的数据库。
2、配置数据库:(如mysql)
在项目目录下的__init__.py文件中,添加
import pymysql
pymysql.install_as_MySQLdb()
然后修改settings.py文件中的DATABASES为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django', #数据库名字
'USER':'root', #用户名
'PASSWORD':'123456', #密码
'HOST':'localhost',
'PORT':'3306',
}
}
3、ORM:
对象--关系--映射(极大的减轻了工作量,不需要因为数据库的变更而修改代码)
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM的任务是:
1、根据对象的类型生成表结构。2、将对象、列表的操作转换为sql语句。3、将sql语句查询到的结果转化为对象、列表。
4、定义模型
模型、属性、表、字段间的关系:一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段。
创建模型类 在models.py文件中添加
from django.db import models
# Create your models here.
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField()
def __str__(self):
return self.gname
class Students(models.Model):
sname=models.CharField(max_length=20)
sgender=models.BooleanField(default=True)
sage=models.IntegerField(db_column='age')
scontend=models.CharField(max_length=20)
isDelete=models.BooleanField(default=False)
#设置关联外键
sgrade=models.ForeignKey('Grades')
def __str__(self):
return self.sname
lasttime=models.DateTimeField(auto_now=True)
createTime=models.DateTimeField(auto_now=True)
5、元选项:在模型类中定义Meta类,用于设置元信息。
然后在终端执行python manage.py makemigrations 生成迁移文件,然后执行python manage.py migrate 执行迁移。
可以看到数据库中的表名被修改成我们自己定义的表名了,myapp_grades没有自己定义就默认命名了。
6、模型成员
类属性:objects是Manager类型的一个对象,作用是与数据库进行交互。当定义模型类是没有指定管理器,则Django为模型创建一个名为objects的管理器。
自定义管理器Manager类:模型管理器是Django的模型进行与数据库进项交互的接口,一个模型可以有多个模型管理器。
作用:向管理器类中添加额外的方法、修改管理器返回的原始查询集(重写get_quertset()方法)
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager,self).get_queryset().filter(isDelete=False)
创建对象:(有两种方法)
方法1:在模型类中添加一个类方法
方法2:在定义管理器中添加一个类方法
7、模型查询
查询集表示从数据库获取的对象集合。查询集可以有多个过滤器,过滤器就是一个函数,基于所给的参数限制查询的结果。
返回单个数据
get():返回一个满足条件的对象。如果没有找到符合条件的模型对象,会引发“模型类.DoesNotExist异常”,如果找到多个对象,也会引发“模型类.MutipleObjectReturned异常”
count():返回查询集中的对象个数
first():返回查询集中的第一个对象
last():返回查询集中的最后一个对象
exists():返回查询集中事都有数据,如果有返回True
限制查询集:
查询返回集列表,可以使用下标的方法进行限制,等同于sql语句中的limit语句。
例:list=Students.objects.all()[0:5] #显示前5条学生的信息 (注意下标不能为负数)
字段查询:
实现了sql中的where语句,作为方法filter()、exclude()、get()的参数
语法:属性名称__比较运算符=值
外键:属性名_id
比较运算符:
exact:判断大小写,对大小写敏感 语法:filter(isDelete=False)
contains:判断是否包含,对大小写敏感。 语法:studentsList=Students.objects.filter(sname__contasins='张')
startswith、endswith:判断是否以value开头、结尾,对大小写敏感
语法:studentsList=Students.objects.filter(sname__startswith='张')
前边四个运算符,在前边加上i,就不区分大小写了。
isnul、isnotnul:判断是否为空。
in:判断是否包含在范围内。 语法:studentsList=Students.objects.filter(pk__in=[2,4,6,8,10])
gt:大于 gte:大于等于 lt:小于 lte:小于等于
语法:studentsList=Students.objects.filter(sage__gt=20) 查找年龄大于20岁的信息。