一、模型介绍

1.ORM架构(Object Relational Mapping,对象关系映射)
方法封装了对应的SQL语句,开发人员不需要去书写SQL语句,只需要调用对应的方法即可。
2.模型映射关系
数据库——>项目 数据表——>类 字段——>类属性

二、配置数据库

  1. 第一步:安装pymysql
  2. 第二步:settings.py配置数据库
  3. DATABASES = {
  4. 'default': {
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME': '数据库名',
  7. 'USER': '用户名',
  8. 'PASSWORD': '密码',
  9. 'IP': 'IP地址',
  10. 'PORT': '端口',
  11. }
  12. }
  13. 第三步:主目录的__init__.py导入pymysql
  14. import pymysql
  15. pymysql.install_as_MySQLdb()
  16. 第四步:models.py文件中定义一个类继承models.Model,书写字段
  17. class User(models.Model):
  18. pass
  19. 第五步:创建映射文件
  20. makemigrations [learning]
  21. 第六步:将映射数据提交到数据库中
  22. migrate [learning]
  23. 第七步:django连接数据库报错,解决办法
  24. 报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.x.xx or newer is required; you have 0.x.x.
  25. 解决办法:
  26. 打开/Python37(python安装目录)/Lib/site-packages/django/db/backends/mysql/base.py,注释掉以下内容:
  27. # if version < (1, 3, 13):
  28. # raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
  29. 报错:AttributeError: 'str' object has no attribute 'decode'
  30. 解决办法:
  31. 打开 xx\Python37\lib\site-packages\django\db\backends\mysql\operations.py 146行的decode修改为encode即可

三、表字段和类属性

  1. 1. IntegerField:映射到数据库中的int类型
  2. 2. CharField:映射到数据库中的varchar类型,通过max_length指定最大长度
  3. 3. TextField:映射到数据库中的text类型
  4. 4. BooleanField:映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField
  5. 5. DateField:映射到数据库中是date类型
  6. 设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间
  7. 设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间
  8. 6. DateTimeField:映射到数据库中的datetime类型,在使用的时候,传递datetime.datetime()进去
  9. 1.primary_key: 主键
  10. 2.unique: 唯一键
  11. 3.null: 指定是否为空,默认为False
  12. 4.blank: 等于Trueform表单验证时可以为空,默认为False
  13. 5.default: 设置默认值
  14. 6.DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。
  15. 这个参数只是DateDateTime以及TimModel.save()方法才会调用e类才有的。
  16. 7.DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
  1. class User(models.Model):
  2. id = models.AutoField(primary_key=True)
  3. name = models.CharField(max_length=20)
  4. age = models.IntegerField(null=True)
  5. sex = models.IntegerField(null=True)class User(models.Model):

四、表的操作

修改表:修改表结构只需要更改模型中的内容,迁移提交即可。
删除表:删除模型类,迁移提交即可。

五、数据的操作

如果想实现数据操作,首先需要在视图中引入模型类

  1. # 第一种
  2. def add_user(request):
  3. user = User(name='cxb', age=18, sex=1)
  4. user.save()
  5. return HttpResponse('添加成功')
  6. # 第二种
  7. def add_user(request):
  8. user = User()
  9. user.name = '王者'
  10. user.age = 18
  11. user.sex = 1
  12. user.save()
  13. return HttpResponse('添加成功')
  14. # 第三种
  15. def add_user(request):
  16. User.objects.create(name='荣耀', age=20, sex=1)
  17. return HttpResponse('添加成功')
  18. # 第四种
  19. def add_user(request):
  20. User.objects.get_or_create(name='和平', age=16, sex=2)
  21. return HttpResponse('添加成功')
  22. # 第五种:通过路由传递参数
  23. def add_user(request, name, age, sex):
  24. User.objects.get_or_create(name=name, age=age, sex=sex)
  25. return HttpResponse('添加成功')
  1. # 删除单个
  2. def del_user(request):
  3. User.objects.get(id=1).delete()
  4. return HttpResponse('删除成功')
  5. # 删除多个
  6. def del_user(request):
  7. User.objects.filter(age=15).delete()
  8. return HttpResponse('删除成功')
  9. # 删除所有
  10. def del_user(request):
  11. User.objects.all().delete()
  12. return HttpResponse('删除成功')
  1. # 修改单条
  2. def update_user(request):
  3. try:
  4. user = User.objects.get(id=1)
  5. user.name = '程晓白'
  6. user.save()
  7. print("姓名:"+str(user.name)+",年龄:"+str(user.age)+",性别:"+str(user.sex))
  8. except Exception as e:
  9. return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")
  10. return HttpResponse('修改成功')
  11. # 修改多条1
  12. def update_user(request):
  13. try:
  14. user_list = User.objects.filter(age=18)
  15. for user in user_list:
  16. user.age = 16
  17. user.save()
  18. print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))
  19. except Exception as e:
  20. return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")
  21. return HttpResponse('修改成功')
  22. # 修改多条2
  23. def update_user(request):
  24. try:
  25. user = User.objects.filter(age=16).update(age=17)
  26. print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))
  27. except Exception as e:
  28. return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")
  29. return HttpResponse('修改成功')
  30. # 修改所有
  31. def update_user(request):
  32. try:
  33. user = User.objects.all().update(age=17)
  34. print("姓名:" + str(user.name) + ",年龄:" + str(user.age) + ",性别:" + str(user.sex))
  35. except Exception as e:
  36. return HttpResponse("修改失败,可能是数据已存在,或者是存在多个数据")
  37. return HttpResponse('修改成功')
  1. # 查询所有
  2. def find_user(request):
  3. user_list = User.objects.all()
  4. print(user_list)
  5. return HttpResponse('查询成功')
  6. # 查询单条
  7. def find_user(request):
  8. user = User.objects.get(id=1)
  9. print(user)
  10. return HttpResponse('查询成功')
  11. # 查询满足条件
  12. def find_user(request):
  13. user_list = User.objects.filter(age=18)
  14. print(user_list)
  15. return HttpResponse('查询成功')
  1. def find_user(request):
  2. # 获取所有数据
  3. # rs = User.objects.all()
  4. # 获取第一条数据
  5. # rs = User.objects.first()
  6. # 获取最后一条数据
  7. # rs = User.objects.last()
  8. # 获取指定条件的多条数据
  9. # rs = User.objects.filter(age=17)
  10. # 获取唯一数据
  11. # rs = User.objects.get(id=1)
  12. # 对结果排序
  13. # rs = User.objects.order_by('sex')
  14. # rs = User.objects.order_by('-sex')
  15. # 多项排序
  16. # rs = User.objects.order_by('age', '-id')
  17. # 获取当前查询到的数据总数
  18. # rs = User.objects.all().count()
  19. # 将QuerySet中的Model转换成字典
  20. # rs = User.objects.all().values()
  21. print(rs)
  22. return HttpResponse('查找成功')
  1. def find_user(request):
  2. # 等于
  3. # rs = User.objects.filter(age=18)
  4. # 包含
  5. # rs = User.objects.filter(name__contains='程')
  6. # 大于/大于等于
  7. # rs = User.objects.filter(age__gt=15)
  8. # rs = User.objects.filter(age__gte=15)
  9. # 小于/小于等于
  10. # rs = User.objects.filter(age__lt=15)
  11. # rs = User.objects.filter(age__lte=15)
  12. # 判断是否为空
  13. # rs = User.objects.filter(id__isnull=True)
  14. # 以...开始/结尾
  15. # rs = User.objects.filter(name__startswith='程')
  16. # rs = User.objects.filter(name__endswith='平')
  17. # 查询多个条件
  18. rs = User.objects.filter(name__in=['王者', '和平'])
  19. # 查询范围
  20. # rs = User.objects.filter(age__range=(18, 23))
  21. print(rs)
  22. return HttpResponse('查找成功')
  1. from django.http import HttpResponse
  2. from .models import User
  3. from django.db.models import Count, Avg, Max, Min, Sum
  4. def find_user(request):
  5. # 统计条数
  6. # rs = User.objects.all().aggregate(Count('age'))
  7. # 求平均值
  8. # rs = User.objects.all().aggregate(Avg('age'))
  9. # 求最大值
  10. # rs = User.objects.all().aggregate(Max('age'))
  11. # 求最小值
  12. # rs = User.objects.all().aggregate(Min('age'))
  13. # 求和
  14. # rs = User.objects.all().aggregate(Sum('age'))
  15. # 修改key值
  16. rs = User.objects.all().aggregate(ageSum=Sum('age'))
  17. print(rs)
  18. return HttpResponse('查找成功')
  1. from django.http import HttpResponse
  2. from .models import User
  3. from django.db.models import Count, Avg, Max, Min, Sum
  4. def find_user(request):
  5. rs = User.objects.values('age').annotate(Count=Count('age'))
  6. print(rs)
  7. return HttpResponse('查找成功')
  1. from django.shortcuts import render, redirect, reverse
  2. from django.http import HttpResponse
  3. from .models import User
  4. from django.db.models import F, Q
  5. def find_user(request):
  6. # F查询
  7. # rs = User.objects.all().update(age=F('age')+1)
  8. # Q查询
  9. rs = User.objects.filter(Q(name='王者') | Q(age=18))
  10. print(rs)
  11. return HttpResponse('查找成功')