一、模型介绍
1.ORM架构(Object Relational Mapping,对象关系映射)
方法封装了对应的SQL语句,开发人员不需要去书写SQL语句,只需要调用对应的方法即可。
2.模型映射关系
数据库——>项目 数据表——>类 字段——>类属性
二、配置数据库
第一步:安装pymysql第二步:settings.py配置数据库DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名','USER': '用户名','PASSWORD': '密码','IP': 'IP地址','PORT': '端口',}}第三步:主目录的__init__.py导入pymysqlimport pymysqlpymysql.install_as_MySQLdb()第四步:models.py文件中定义一个类继承models.Model,书写字段class User(models.Model):pass第五步:创建映射文件makemigrations [learning]第六步:将映射数据提交到数据库中migrate [learning]第七步:django连接数据库报错,解决办法报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.x.xx or newer is required; you have 0.x.x.解决办法:打开/Python37(python安装目录)/Lib/site-packages/django/db/backends/mysql/base.py,注释掉以下内容:# if version < (1, 3, 13):# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)报错:AttributeError: 'str' object has no attribute 'decode'解决办法:打开 xx\Python37\lib\site-packages\django\db\backends\mysql\operations.py 把146行的decode修改为encode即可
三、表字段和类属性
1. IntegerField:映射到数据库中的int类型2. CharField:映射到数据库中的varchar类型,通过max_length指定最大长度3. TextField:映射到数据库中的text类型4. BooleanField:映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField5. DateField:映射到数据库中是date类型设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间6. DateTimeField:映射到数据库中的datetime类型,在使用的时候,传递datetime.datetime()进去1.primary_key: 主键2.unique: 唯一键3.null: 指定是否为空,默认为False4.blank: 等于True时form表单验证时可以为空,默认为False5.default: 设置默认值6.DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。7.DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
class User(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=20)age = models.IntegerField(null=True)sex = models.IntegerField(null=True)class User(models.Model):
四、表的操作
修改表:修改表结构只需要更改模型中的内容,迁移提交即可。
删除表:删除模型类,迁移提交即可。
五、数据的操作
如果想实现数据操作,首先需要在视图中引入模型类
# 第一种def add_user(request):user = User(name='cxb', age=18, sex=1)user.save()return HttpResponse('添加成功')# 第二种def add_user(request):user = User()user.name = '王者'user.age = 18user.sex = 1user.save()return HttpResponse('添加成功')# 第三种def add_user(request):User.objects.create(name='荣耀', age=20, sex=1)return HttpResponse('添加成功')# 第四种def add_user(request):User.objects.get_or_create(name='和平', age=16, sex=2)return HttpResponse('添加成功')# 第五种:通过路由传递参数def add_user(request, name, age, sex):User.objects.get_or_create(name=name, age=age, sex=sex)return HttpResponse('添加成功')
# 删除单个def del_user(request):User.objects.get(id=1).delete()return HttpResponse('删除成功')# 删除多个def del_user(request):User.objects.filter(age=15).delete()return HttpResponse('删除成功')# 删除所有def del_user(request):User.objects.all().delete()return HttpResponse('删除成功')
# 修改单条def update_user(request):try:user = User.objects.get(id=1)user.name = '程晓白'user.save()print("姓名:"+str(user.name)+",年龄:"+str(user.age)+",性别:"+str(user.sex))except Exception as e:return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")return HttpResponse('修改成功')# 修改多条1def update_user(request):try:user_list = User.objects.filter(age=18)for user in user_list:user.age = 16user.save()print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))except Exception as e:return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")return HttpResponse('修改成功')# 修改多条2def update_user(request):try:user = User.objects.filter(age=16).update(age=17)print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))except Exception as e:return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")return HttpResponse('修改成功')# 修改所有def update_user(request):try:user = User.objects.all().update(age=17)print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))except Exception as e:return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")return HttpResponse('修改成功')
# 查询所有def find_user(request):user_list = User.objects.all()print(user_list)return HttpResponse('查询成功')# 查询单条def find_user(request):user = User.objects.get(id=1)print(user)return HttpResponse('查询成功')# 查询满足条件def find_user(request):user_list = User.objects.filter(age=18)print(user_list)return HttpResponse('查询成功')
def find_user(request):# 获取所有数据# rs = User.objects.all()# 获取第一条数据# rs = User.objects.first()# 获取最后一条数据# rs = User.objects.last()# 获取指定条件的多条数据# rs = User.objects.filter(age=17)# 获取唯一数据# rs = User.objects.get(id=1)# 对结果排序# rs = User.objects.order_by('sex')# rs = User.objects.order_by('-sex')# 多项排序# rs = User.objects.order_by('age', '-id')# 获取当前查询到的数据总数# rs = User.objects.all().count()# 将QuerySet中的Model转换成字典# rs = User.objects.all().values()print(rs)return HttpResponse('查找成功')
def find_user(request):# 等于# rs = User.objects.filter(age=18)# 包含# rs = User.objects.filter(name__contains='程')# 大于/大于等于# rs = User.objects.filter(age__gt=15)# rs = User.objects.filter(age__gte=15)# 小于/小于等于# rs = User.objects.filter(age__lt=15)# rs = User.objects.filter(age__lte=15)# 判断是否为空# rs = User.objects.filter(id__isnull=True)# 以...开始/结尾# rs = User.objects.filter(name__startswith='程')# rs = User.objects.filter(name__endswith='平')# 查询多个条件rs = User.objects.filter(name__in=['王者', '和平'])# 查询范围# rs = User.objects.filter(age__range=(18, 23))print(rs)return HttpResponse('查找成功')
from django.http import HttpResponsefrom .models import Userfrom django.db.models import Count, Avg, Max, Min, Sumdef find_user(request):# 统计条数# rs = User.objects.all().aggregate(Count('age'))# 求平均值# rs = User.objects.all().aggregate(Avg('age'))# 求最大值# rs = User.objects.all().aggregate(Max('age'))# 求最小值# rs = User.objects.all().aggregate(Min('age'))# 求和# rs = User.objects.all().aggregate(Sum('age'))# 修改key值rs = User.objects.all().aggregate(ageSum=Sum('age'))print(rs)return HttpResponse('查找成功')
from django.http import HttpResponsefrom .models import Userfrom django.db.models import Count, Avg, Max, Min, Sumdef find_user(request):rs = User.objects.values('age').annotate(Count=Count('age'))print(rs)return HttpResponse('查找成功')
from django.shortcuts import render, redirect, reversefrom django.http import HttpResponsefrom .models import Userfrom django.db.models import F, Qdef find_user(request):# F查询# rs = User.objects.all().update(age=F('age')+1)# Q查询rs = User.objects.filter(Q(name='王者') | Q(age=18))print(rs)return HttpResponse('查找成功')
