创建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.字段类型(字段选项)
__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 |
用法:模型类.objects.filter(模型类属性名__比较运算符 = 值)
比较运算符
示例
# 查询名字包含 ‘马’ 的员工
Employee.objects.filter(name__contains='马')
# 例:查询id不为3的员工
Employee.objects.exclude(id=3)
作用:查询条件中要比较表中的两个字段
# 例:查询年龄大于id的员工信息(无实际意义)
select * from employee where age > id;
Employee.objects.filter(age__gt=F('id'))
作用:对查询条件进行 与 或 非 (& | ~) 的逻辑操作
与: 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)) # 非
用法: 模型类.objects.aggregate(聚合类(‘属性名’))
常用聚合类有:Sum, Count, Max, Min, Avg等
返回值是一个字典, 格式: {'属性名__聚合函数': 值}
示例:
Employee.objects.aggregate(Avg('salary'))
通过对象实现
一查多
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='赵小二')