数据库配置
-
创建mysql数据库:
create database db_django01 charset=utf8;
-
配置mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库产品
'HOST': "localhost", # 数据库ip
'PORT': 3306, # 数据库端口
'USER': "root", # 用户名
'PASSWORD': "mysql", # 密码
'NAME': "db_django01", # 数据库名
}
}
-
安装 pymysql 第三方包:
pip install pymysql
-
在
与项目同名的包
下的__init__.py
文件中,设置模块名:import pymysql pymysql.install_as_MySQLdb()
执行迁移命令
- 生成迁移文件:
python manage.py makemigrations
- 生成表:
python manage.py migrate
模型类定义
-
继承
models.Model
类定义模型类 -
在模型类中定义属性,格式:
属性名 = models.字段类型(字段选项)
- 属性名不能是python 保留关键字
- 属性名不能包含两个连续的下划线, 例: 属性名
__name
不合法
-
默认会自动生成
id
主键 -
示例:
class Department(models.Model): name = models.CharField(max_length=20) create_date = models.DateField(auto_now_add=True) is_delete = models.BooleanField(default=False) class Meta: # 指定表名 db_table = 'department' class Employee(models.Model): choices_gender = ( (0, '男'), (1, '女'), ) name = models.CharField(max_length=20) age = models.IntegerField() gender = models.IntegerField(default=0, choices=choices_gender) salary = models.DecimalField(max_digits=8, decimal_places=2) comment = models.CharField(max_length=300, null=True, blank=True) hire_date = models.DateField(auto_now_add=True) department = models.ForeignKey('Department') class Meta: # 指定表名 db_table = 'employee'
模型管理器
管理器中的方法 | 返回类型 | 作用 |
---|---|---|
模型类.objects.create() | 模型类对象 | 创建一个对象(新增一条数据) |
模型类.objects.get() | 模型对象 | 查询一个对象,且只能有一个: 如果查到多条数据,则报: MultipleObjectsReturned 如果查询不到数据,则报: DoesNotExist |
模型类.objects.all() | QuerySet | 查询所有的对象 |
模型类.objects.count() | 数字 | 查询总共有多少条数据 |
模型类.objects.filter() | QuerySet | 查询满足条件的对象 |
模型类.objects.exclude() | QuerySet | 查询不满条件的对象 |
模型类.objects.order_by() | QuerySet | 对查询结果集进行排序 |
模型类.objects.aggregate() | 字典 例如: {‘salary__avg’: 9500.0} |
进行聚合操作 Sum, Count, Max, Min, Avg |
数据增删改
- 新增
- 方式1:模型类.objects.create(属性1=值1,属性2=值2,…)
- 方式2:模型对象.save()
- 删除
- 方式1:模型类.objects.filter(查询条件).delete()
- 方式2:模型对象.delete()
- 更新
- 方式1:模型类.objects.filter(查询条件).update(属性1=值1,属性2=值2,…)
- 方式2:模型对象.save()
查询
条件查询
用法:模型类.objects.filter(模型类属性名__比较运算符 = 值)
- 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
-
比较运算符
- exact
- contains / endswith / startswith
- isnull
- in
- gt(greater than)、lt(less than)、gte、lte
- year、month、day、week_day、hour、minute、second
-
示例
# 查询名字包含 ‘马’ 的员工 Employee.objects.filter(name__contains='马')
exclude方法
# 例:查询id不为3的员工
Employee.objects.exclude(id=3)
F对象
作用:查询条件中要比较表中的两个字段
# 例:查询年龄大于id的员工信息(无实际意义)
select * from employee where age > id;
Employee.objects.filter(age__gt=F('id'))
Q对象
作用:对查询条件进行 与 或 非 (& | ~) 的逻辑操作
-
与: Q(查询条件1) & Q(查询条件2)
-
或: Q(查询条件1) | Q(查询条件2)
-
非: ~Q(查询条件)
示例
Employee.objects.filter(Q(id__gt=3) & Q(age__gt=30)) # 与
Employee.objects.filter(Q(id__gt=3) | Q(age__gt=30)) # 或
Employee.objects.filter(~Q(id=3)) # 非
aggregate`方法
用法: 模型类.objects.aggregate(聚合类(‘属性名’))
-
常用聚合类有:Sum, Count, Max, Min, Avg等
-
返回值是一个字典, 格式:
{'属性名__聚合函数': 值}
-
示例:
Employee.objects.aggregate(Avg('salary'))
order_by方法
- 升序: 模型类.objects.order_by(‘属性名’)
- 降序: 模型类.objects.order_by(’-属性名’)
关联查询
-
通过对象实现
-
一查多
d = Department.objects.get(name=‘研发部’) d.employee_set.all() # 属性:(多)类名小写_set
-
多查一
e = Employee.objects.get(name='赵小二') e.department # 关联属性
-
-
通过模型类实现
-
一查多:
多类名.objects.filter(关联属性__属性名__条件名=值)
-
多查一:
一类名.objects.filter(多类名小写__属性名__条件名=值)
示例
Employee.objects.filter(department__name__exact='研发部') Department.objects.filter(employee__name__exact='赵小二') # 简写 Employee.objects.filter(department__name='研发部') Department.objects.filter(employee__name='赵小二')
-
查询集QuerySet
- 查询集的方法
get, all, count, filter, exclude, order_by, aggregate, exists - 限制查询集
- 通过下标取元素
- 切片操作,返回一个新的查询集
- 下标不能为负数
- 两大特性
- 惰性查询: 用到查询集中的数据时,才会去查询数据库
- 缓存: 当第一次遍历使用了查询集中所有的数据后,django会缓存查询集中的数据,
下次用到时,读取缓存