一、Model层开发过程
1.安装驱动模块
pip install mysqlclient
2.数据库配置
在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'test', # 数据库名
'USER': 'root', # 用户名
'PASSWORD': '123456', # 密码
'HOST':'localhost', # 主机ip
'PORT':3306, # 端口号
}
}
3.创建并安装APP
- Django规定,如果要使用模型,必须要创建一个app(以 userapp 举例):
python manage.py startapp userapp
- 安装App 在settings.py文件中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'userapp', # 创建的app名
]
4.定义Model类
在App目录下的Models.py文件中,添加Model类:
class User(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
salary=models.DecimalField(max_digits=7,decimal_places=2)
class Meta:
db_table = 't_user' #自定义数据表名
5.生成迁移文件记录(pycharm 终端窗口)
python manage.py makemigrations # 生成迁移记录
6.执行迁移操作(pycharm 终端窗口,紧接上一步)
python manage.py migrate # 执行迁移操作--应用到数据库
二、模型字段
1.基础字段类型
字段类型 | 说明 |
---|---|
AutoField | 一般不直接使用,Model中默认的主键类型。 如果自己没定义,Django默认给每个Model一个主键字段id。 |
CharField | max_length是必填属性。varchar |
IntegerField | 4字节。int |
DecimalField | max_digits(必填):共有几位数; decimal_places(必填):小数占几位。decimal |
DateField | 可选:auto_now=True 可做修改时间记录 可选:auto_now_add=True 可做首次添加时间 注意:以上两属性之一指定后,该字段不允许被编辑。 |
BooleanField | 接受“True/False”。tinyint |
NullBooleanField | 接受“True/False/None”。 tinyint |
2.其它字段类型
字段类型 | 说明 |
---|---|
SmallIntegerField | 2字节。smallint |
BigIntegerField | 8字节。bigint |
FloatField | 不如 decimal 类型精确。double |
TextField | longtext |
DateTimeField | datetime |
TimeField | time |
ForeignKey | ForeignKey(to=关系对方的类或类名或‘self’,on_delete=级联选项) 。 一对多关联关系要用到。 |
OneToOneField | OneToOneFiled(to=关系对方的类或类名或‘self’,on_delete=级联选项)。 一对一关联关系要用到。 |
ManyToManyField | ManyToManyField(to=关系对方的类或类名或‘self’) 。 多对多关联关系要用到。 |
ImageField | 向服务器上传文件要用到。参数有upload_to:指定该文件要存放的子目录。 |
3.字段参数
字段类型 | 说明 |
---|---|
null | 默认为False,表示该字段不能为空。 |
default | 定义默认值,是django的约定,必须通过python代码才能在数据库上产生效果。 |
unique | 列值是否唯一。选填“Ture/False”。 |
primary_key | 默认自动创建 id字段,为主键。选填“Ture/False”。 |
db_column | 自定义列名,默认与 field 同名。 |
db_index | 是否在该列建立索引。 |
blank | 默认False,用于前端页面的form验证。 |
4.元数据Meta
模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名等等。
- db_table = ‘xxx’ 设置表名(修改django默认生成的表名)
- unique_together = ((‘列名1’,‘列名2’),(…)) 设置联合约束
- ordering = [‘列名1’] 或 [‘列名1’,‘列名2’]
三、增删改查
1.Model Manager QuerySet
-
每个Model类都有一个默认的manager实例,名为objects。
-
对数据库中对象的检索, 是通过 model Manager 来构造一个 QuerySet 对象来实现。
-
manager 可理解为对QuerySet进行管理的一个类,可以通过manager的一些方法获取到QuerySet集合(可遍历)。
2.增加数据(两种方法任选其一)
Mysql语句"insert into tablename(name,age,salary) values (“liubei”,18,100) "在Django中 对应代码:
user=User(name='liubei',age=18,salary=100)
user.save()
User.objects.create(name='liubei',age=18,salary=100)
3.删除数据
delete from tablename where id = 1
User.objects.get(pk=1).delete()
4.修改数据
update tablename set name=“zhangfei” where age=18
user=User.objects.get(age=18)
user.name='zhangfei'
user.save()
5.查询数据
'User.objeccts’返回的是manager实例对象,
'User.objects.方法名()返回需要的结果。
- 基本操作
User.objects.all() #返回数据库中所有记录对应的User类对象的QuerySet集合。
User.objects.get(pk=1) #返回数据库中id为1记录对应的User类对象
User.objects.filter() #等同于User.objects.all(),但是可以加条件
User.objects.filter(pk=1) #返回数据库中id为1记录对应的User类对象的QuerySet集合,
#对比get()方法:即使在数据库库中找不到符合条件的记录,也不会报错,而是返回Null。
User.objects.count() #返回int型,值为数据库中所有记录的条数
User.objects.all().count() #与上一行效果相同
User.objects.exclude(pk=1) #返回除id=1外的其他记录对应的User类对象的QuerySet集合。
User.objects.first() #返回数据库中第一条记录对应的User类对象
User.objects.last() #返回数据库中最后一条记录对应的User类对象
User.objects.exists() #判断表中是否有记录,返回 True 或 False
- order_by排序
User.objects.order_by('-age') #返回数据库中所有的记录按age降序后的QuerySet集合
User.objects.order_by('age') #按年龄升序
User.objects.filter(age=18).order_by('age','-name') #筛选出age为18的记录,先按age升序,如果age相同,就按name降序(ASCII码)
- 条件查询
User.objects.filter(pk__lt=5) #双下划线。lt:小于; gt:大于; lte:小于等于
- 模糊查询
contains、icontains:包含、包含(对大小写不敏感–i表示忽略)——“%xx%”
startswith、istartswith:以…开始—— “xx%”
endswith、iendswith:以…结尾——"%xx"
User.objects.filter(name__contains='i')
User.objects.filter(name__startswith='l')
User.objects.filter(name__endswith='l')
- 范围查询
User.objects.filter(id__range=(1,3))
User.objects.filter(id__in=(1,2,3)) #与上一行效果相同
- 空值查询
User.objects.filter(age__isnull=True)
- 映射查询
User.objects.values() #返回QuerySet对象,包含的元素都是dict
User.objects.filter(id__lt=4).values('pk')
User.objects.values('pk')
=User.objects.only('pk').values('pk') #only返回QuerySet对象。延缓查询
- 聚合查询
from django.db.models import Count, Max,Avg,Min,Sum
User.objects.filter(pk__lt=5).aggregate(Max('pk')) #aggregate返回一个字典,条目的键为'pk__max'(取决于aggregate方法传入的参数),值为聚合后的结果
User.objects.filter(pk__lt=5).aggregate(m=Max('pk')) #起别名m,返回字典的键为m
- 分组查询
from django.db.models import Count,Max,Avg,Min,Sum
User.objects.values('age').annotate(Max('salary')) #将vlaues()中的列作为分组条件时的列
# select age,Count(age) from t_user group by age
User.objects.values('age','id').annotate(Max('salary')) #values()中有两个字段,则两字段都相同才为一个组,即联合唯一,分组后再根据annotate()方法中的字段做统计操作
User.objects.values('age').annotate(Count('salary'))
User.objects.filter(age__lt=4).values('age').annotate(Count('salary'))#可以先筛选再分组
User.objects.values('age').annotate(s=Sum('salary'))
#以下三种写法返回结果相同
User.objects.filter(age__lt=30).values('age').annotate(s=Sum('salary')).filter(s__gt=100)
User.objects.values('age').filter(age__lt=30).annotate(s=Sum('salary')).filter(s__gt=100)
User.objects.values('age').annotate(s=Sum('salary')).filter(age__lt=30).filter(s__gt=100)
- F()和Q()函数
from django.db.models import F, Q
User.objects.filter(id__lt=F('age')) #当查询条件中需要另外的列时,可以使用F,例如查询满足"id<age"的记录。
User.objects.filter(Q(id=3)|Q(age=25)) #当需要 “或 (|) 非(~)” 逻辑时,可以使用Q
User.objects.filter(Q(id=3)|~Q(age=25))
User.objects.filter(Q(id=3),~Q(age=25)) #‘,’连接表示 ‘且’