Django对各类数据库提供了很好的支持,并提供了统一的调用API
# __init__.py
import pymysql
# 导入mysql数据库api
pymysql.install_as_MySQLdb()
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'root',
'PASSWORD': '0000',
'HOST': 'localhost',
'PORT': '3306',
}
}
修改__init__.py和settings.py文件
# myapp/models.py
from django.db import models
class Students(models.Model):
# 自定义模型管理器
# 使用了自定义模型管理器后,objects就不存在了
# stuObj = models.Manager()
stuObj2 = StuManager()
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
sgrade = models.ForeignKey('Grades')
class Students(models.Model):
# 自定义模型管理器
# 使用了自定义模型管理器后,objects就不存在了
# stuObj = models.Manager()
stuObj2 = StuManager()
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
sgrade = models.ForeignKey('Grades')
注意:若要重新执生成迁移文件,需将myapp/migrations目录中,除了__init__.py文件以外的文件删除,再生成迁移文件
(learning_environment) F:\pythonfiles\learn_django\project>python manage.py makemigrations
Migrations for 'myapp':
myapp\migrations\0001_initial.py
- Create model Grades
- Create model Students
(learning_environment) F:\pythonfiles\learn_django\project>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying myapp.0001_initial... OK
Applying sessions.0001_initial... OK
mysql> show tables;
+----------------------------+
| Tables_in_django_learn |
+----------------------------+
| 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 |
| myapp_grades |
| myapp_students |
+----------------------------+
12 rows in set (0.00 sec)
对象——关系——映射
Object——Relation——Mapping
1、根据对象类型,生成表结构
2、将对对象的操作转换成ORM操作
3、将SQL语句操作的结果转换成对象列表
极大地减轻了开发人员的工作量,且不需要因数据库类型的变更而修改代码
1、一个模型类对应数据库中的一张表
2、模型类中定义的属性对应该模型类对应数据表的字段
django | 数据库 |
---|---|
模型Model | 数据表table |
属性 | 字段 |
属性类型被定义在django.db.models.fields中
字段类型 | 说明 |
---|---|
AutoField | 主键类 在model中不写,则自动添加 |
CharField | 字符串类 |
TextField | 大文本字段 对应于HTML中文本域进行显示 |
IntegerField | 整数类 |
DecimalField | 小数类 可选参数max_digits= 显示总位数 decimal_places=小数点后位数 |
FloatField | 浮点数类 |
BooleanField | 布尔类型 可选范围 |
NullBooleanField | 布尔类型 可选范围 |
DateField | 日期类型(YYYY-MM-DD) 可选参数auto_now = True 保存修改时间 auto_now_add = True 保存创建时间 |
TimeFied | 时间类型(HH-MM-SS) 可选参数与上同 但以上两个初始不可同时赋值为True |
DateTimeField | 日期-时间类型(YYYY-MM-DD HH-MM-SS) 可选参数与上同 |
FileField | 文件类 |
ImageField | 图像类 |
此外,每个字段都可以允许有以下的字段选项
字段选项 | 说明 |
---|---|
null | 若为True,则会将空值以null存入数据库 |
blanke | 若为True,则该字段允许为空白 |
db_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若为True,则会在表中会以此字段创建索引 |
default | 设置默认值 |
primary_key | 若为True,则该字段会成为模型的主键字段 |
unique | 若为True,则这个字段在表中必须有唯一值 |
1、ForeignKey:一对多关系,将该字段定义在多的模型类中
2、ManyToManyField:多对多关系,将该字段定义在两个模型类中
3、OneToOneField:一对一关系,将该字段定义在任意一个模型类中
1、一访问多:
对象.模型类小写_set
示例:
grade.students_set,则访问在grade对象中,包含的students对象
2、一访问一:
对象.模型类小写
示例:
grade.students,则访问grade对象中,包含的唯一一个students对象
3、访问id:
对象.属性_id
示例:
student.grade_id,则访问student对象,所属grade的id
在模型类中定义Meta类,用于设置元信息
db_table:定义数据表名,若不写,则默认为项目名_类名
ordering:对象的默认排序字段
class Students(models.Model):
class Meta:
db_table = 'students'
ordering = ['id'] # ['-id']降序
object 是manager类型的对象,作用是与数据库交互,若用户没有定义管理器,Django将为模型创建一个名为object的manager管理器
Manager类是Django与数据库交互的接口,其作用是向管理器中添加额外方法,其二是修改管理器返回的原始查询集(重写get_queryset()方法)
#myapp/models.py
#自定义manager管理器
class StuManager(models.Manager):
# 查询集经过过滤器筛选,返回新的查询集合
def get_queryset(self):
return super(StuManager, self).get_queryset()
class Students(models.Model):
# 自定义模型管理器
# 使用了自定义模型管理器后,objects就不存在了
# stuObj = models.Manager()
stuObj2 = StuManager()
目的:向数据库中添加数据
创建对象时,django与数据库不进行读写操作,调用对象的save()方法时,才会保存对象至数据库
在模型类中增加创建对象的类方法
class Students(models.Model):
# 定义一个类方法创建对象
@classmethod
def createStu(cls, name, age, gender, contend, grade, isD=False):
student = cls(sname=name,
sage=age,
sgender=gender,
scontend=contend,
isDelete=isD,
sgrade=grade,
)
return student
在自定义管理器中添加方法
#自定义manager管理器
class StuManager(models.Manager):
# 自定义管理器创建对象
def creatstudents(self,name, age, gender, contend, grade, isD=False):
stu = self.model()
stu.sname = name
stu.age = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
return stu
以数据库中获取的对象构成的集合
1、可以在管理器上调用过滤器方法
class StuManager(models.Manager):
# 查询集经过过滤器筛选,返回新的查询集合
def get_queryset(self):
return super(StuManager, self).get_queryset().filter(isDelete=False)
2、经过过滤器输出的仍然是一个查询集,可以多次调用filter方法
class StuManager(models.Manager):
# 查询集经过过滤器筛选,返回新的查询集合
def get_queryset(self):
return super(StuManager, self).get_queryset().filter(isDelete=False).filter().filter()
3、惰性执行特性:创建查询集不会带来数据库的访问,直到调用查询集时,才会访问数据库
4、直接访问数据的情况:迭代、序列号和与if合用
5、返回查询集的过滤器
方法 | 功能 |
---|---|
all() | 返回全部数据,不过滤内容 |
filter() | 获取指定内容 形式:filter(key = values).filter().filter()可多次获取 |
exclude() | 除去符合条件的数据 |
order_by() | 排序 |
values() | 返回一个列表,内容为对象的字典形式 |
6、返回单个数据
方法 | 功能 |
---|---|
get() | 返回一个满足条件的对象 可能存在的异常包括: 若未匹配数据会引发ObjectNotExist异常 若存在多个匹配数据会引发MultipleObjectReturn异常 |
count() | 返回查询集中的对象个数 |
first() | 返回查询集中的第一个对象 |
last() | 返回查询集中的最后一个对象 |
exists() | 判断查询集中是否有目标数据 |
7、限制查询集个数
使用下标的方式(切片操作)
#通过切片进行分页操作
def stupage(request, page):
start_num = int(page)-1
end_num = int(page)
student_list = Students.stuObj2.all()[start_num:end_num]
return render(request, 'myapp/students.html', {'students': student_list})
8、查询集的缓存
每个查询集都有缓存,以减少对数据库的访问次数。在新建的查询集中,缓存首次为空,会发生数据缓存,django会将查询集的数据进行缓存,并返回查询结果。此次之后的查询将直接使用查询集的缓存。
9、字段查询
实现了sql中的where语句,作为方法filter(),exclude(),get()的参数。
语法:属性名称__比较运算符=值(双下划线)
外键:属性名_id (单下划线)
转移:
比较运算符 | 含义 |
---|---|
exact | 判断。区分大小写 |
contains | 包含。区分大小写 |
startswith | 以…起始 |
endswith | 以…结束 |
isnull | 为空 |
isnotnull | 非空 |
in | 是否包含在范围内 |
gt gte lt lte |
> >= < <= |
year month day week_day hour minute second |
年 月 日 周 时 分 秒 |
studentslist = Students.stuObj2.filter(sname__contains='chen')
studentslist = Students.stuObj2.filter(sname__startswith='chen')
studentslist = Students.stuObj2.filter(isname__startswith='chen')
studentslist = Students.stuObj2.filter(sname__in=['chen', 'li'])
studentslist = Students.stuObj2.filter(sage__gt=10)
10、跨关联查询
处理join(关联)查询
语法: 模型类名__属性名__比较运算符
grade_class = Grades.objects.filter(students_scontend_contains = 'chendingwei')
11、查询快捷
pk代表主键,主键字段可以自动设置为自增数列,或人工在model中标识主键
grade = Grades.objects.get(pk=2)
12、聚合函数
使用aggregate()函数返回聚合函数的值
聚合函数 | 含义 |
---|---|
Avg | 平均值 |
Count | 累积 |
Max | 最大值 |
Min | 最小值 |
Sum | 求和 |
# 需要从models中导入需要的聚合函数
from django.db.models import Max
def studentsearch(request):
maxage = Students.stuObj2.aggregate(Max('sage'))
return HttpResponse('0000')
13、F对象
①比较同一个模型中的A属性和B属性
②支持F对象的算术运算
grade_gril = Grades.objects.filter(ggrilnum__gt=F('gboynum'))
grade_gril = Grades.objects.filter(ggrilnum__gt=F('gboynum')+20)
14、Q对象
过滤器方法中的关键字参数,使用Q对象可以解决“或”的逻辑关系,~Q表示取反。
studentslist = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))