web后端Django-前戏之数据库增删改查

概念引入

ORM(objects relationship mapping): 对象关系映射;
objects: 管理器,默认模型的属性;

1.数据增加中间表(即自己需要管理的表)

举例操作:创建一张学生表,包含名字,性别,年龄,创立日期以及更新日期;
  • a:在django-admin startproject app . 或者 python manage.py startapp app之后即可看见工程中有app文件,其中有一个model.py文件,进入即可。
  • b:创建类以及创建表名字,需要导入model模块
    from django.db import models
    # Create your models here.
    class Student(models.Model):
      s_name = models.CharField(max_length=10,unique=True)
      s_age = models.IntegerField(default=20)
      s_gender = models.BooleanField(default=0)
      create_time = models.DateTimeField(auto_now_add=True)
      # auto_now_add   创建时,默认字段赋值为最新的事件
      # create_time = models.DateField
      updata_time = models.DateTimeField(auto_now=True)
      # 修改数据是,自动赋值为更新字段时 的时间。
      math = models.DecimalField(max_digits=3,decimal_places=1,null=True)
      wuli = models.DecimalField(max_digits=3,decimal_places=1,null=True)
      class Meta:
          db_table = 'student'
    
  • c:在pycharm终端中执行两条迁移命令,即可在数据库中创建表;
    • 生成迁移文件:python manage.py makemigrations;
    • 执行迁移文件“:python manage.py migrate;

      2.数据库的增操作

  • a:进入url.py文件,在urlpatterns中增加路径同时导入相应模块。
    模块导入:
    from django.contrib import admin
    from django.urls import path
    from app import views
    
    增加添加学生模块:
    # https://120.0.0.1:8080/add_stu/  访问路由即可插入学生信息
    # 增加学生信息
    path('add_stu/',views.add_stu)
    
  • b:进入views.py文件中导入模块以及写入相应函数方法
    模块导入:

    from django.shortcuts import render
    from django.http import HttpResponse
    # Create your viewshere.
    from app.models import Student
    

    写入添加学生方法:

    def add_stu(request):
      #实现插入学生信息,第一种方式;
      Student.objects.create(s_name='小明')
    
      #实现插入学生信息,第二种方式,使用对象的方式进行添加学生信息。
    def add_stu(request):
      stu = Student()
      stu.s_name = 'lorry'
      stu.s_age = 26
      stu.s_gender = 1
      stu.save()
      return  HttpResponse('创建学生成功')
    

    3.数据库的删操作

  • a:进入url.py文件,在urlpatterns中增加路由路径。
      #删除学生信息
      path('del_stu/',views.del_stu),
    
  • b:进入views.py文件中导入模块以及写入相应函数方法
    模块导入:
    def del_stu(requset):
      #实现删除
      #1.获取删除的对象,filter(条件)
      #2.实现删除方法,delete()
      Student.objects.filter(id=3).delete()
      return HttpResponse('删除学生成功')
    

    4.数据库的更新操作

  • a:进入url.py文件,在urlpatterns中增加路径。
      更新学生
      path('up_stu/',views.up_stu),
    
  • b:进入views.py文件中导入模块以及写入相应函数方法
    模块导入:
    • 更新的第一种方法:
    • 说明:
    • 1.获取更新的数据,filter(条件)
    • 2.实现更新方法,update()
      def up_stu(requset):
      #Student.objects.filter(id=2).update(s_name='lorry')
      
  • 更新的第二种方式,即可更新时间字段
    def up_stu(requset):
      #更新的第二种方式,即可更新时间字段
      stu = Student.objects.filter(id=2).first()
      stu.s_name = 'lorrybz'
      stu.save()
      return HttpResponse('更新学生成功')
    

    5.数据库的查询操作

  • a:进入url.py文件,在urlpatterns中增加路径。
      #查询学生
      path('sel_stu/',views.sel_stu),
    
  • b:进入views.py文件中导入模块以及写入相应函数方法
    ######查询学生
    #导入模块
    from django.db.models import Avg, Max, Min, Sum, Count, Q, F
    def sel_stu(requset):
      # 查询学生信息
      #  查询所有的学生信息
      stus = Student.objects.all()
      for stu in stus:
          print(stu.s_name)
          print(stu.s_gender)
    
  • 使用过滤器查询学生fillter和git
      # 查询id=2的学生,fillter
      # 若是条件不成立不会报错,返回值为空
      stu = Student.objects.filter(id=2).first()
      print(stu.s_gender)
      # 1.取唯一的一个对象
      # 2.get(条件必须成立),若是条件不成立会报错
      stu = Student.objects.get(id=2)
      print(stu)
    
  • 过滤出满足条件和不满条件的fillter和exclude。
      # 过滤出不满足条件的信息上面是满足条件,下面是不满足条件的
      stus = Student.objects.filter(s_gender=1)
      print(stus)
      stus = Student.objects.exclude(s_gender=0)
      print(stus)
    
  • 排序:默认是升序,在id或者筛选条件前加 ‘-’即可将序
      #排序order_by
      stus = Student.objects.order_by('-id')
      print(stus)
    
  • 取出对象中的某个字段
     stus = Student.objects.all().values('s_name','s_age')
     print(stus)
     stus = Student.objects.all().values()
     print(stus)
    
  • 判断查询结果是否存在
      a = Student.objects.filter(s_name='校长').exists()
      print(a)
    
  • 对过滤的条件进行计数,有两种方法

    方法1:
      stus = Student.objects.filter(s_gender=1)
      print(len(stus))
    方法2:
      count = Student.objects.filter(s_gender=1).count()
      print(count)
    
      stus = Student.objects.filter(s_name='lorrybz').first()
      print(stus)
    
  • 第二大类模糊查询contains

      ##contains
      # 字段——运算符
      stus = Student.objects.filter(s_name__contains='小')
      print(stus)
    
      #like '小%'   '%明'
      # startwith  endwith
    
      stus = Student.objects.filter(s_name__startswith='小')
      print(stus)
      stus = Student.objects.filter(s_name__endswith='z')
      print(stus)
      # sql where id in (12345679)
      # 模糊判断
      stus = Student.objects.filter(id__in=[1,2,3,4,5])
      print(stus)
      stus = Student.objects.filter(pk__in=[1,2,3,4,5])
      print(stus)
    
  • 比较运算符
      #gt >;gte >=;   lt <; lte <=;#并且操作
      stus = Student.objects.filter(s_age__gte=18,s_age__lt=20)
      print(stus)
      stus = Student.objects.filter(s_age__gte=18).filter(s_age__lt=20)
      print(stus)
    
  • 聚合函数 avg max min sum count
    • 语法: 模型名.objects.all().aggregate(Sum(字段))
      # 聚合函数 avg max min sum count
      age_avg = Student.objects.all().aggregate(Avg('s_age'))
      print(age_avg)
      sum_avg = Student.objects.all().aggregate(Sum('s_age'))
      print(sum_avg)
      max_avg = Student.objects.all().aggregate(Max('s_age'))
      print(max_avg)
      min_avg = Student.objects.all().aggregate(Min('s_age'))
      print(min_avg)
      
  • 与或非的计算

    • 要点(1)Q将条件包起来进行与或非函数的比较
    • 要点(2)与1: Q(条件1), Q(条件2)
    • 要点(3)与2: Q(条件1) & Q(条件2) ;: Q(条件1) and Q(条件2) ;
    • 要点(4)或: Q(条件1) | Q(条件2) ;Q(条件1) or Q(条件2)
    • 要点(5)非: ~Q(条件1)
    • 要点(6)用于比较两个字段,可使用+,-符号
    • 模型名.objects.filter(wuli__gt=F(‘math’)-10)

      #查询年龄大于等于18  且 小于20
      stus = Student.objects.filter(s_age__gte=18, s_age__lt=20)
      print(stus)
      #  ,& 和and 是且的操作   or 或者, 查询年龄大于等于18 或者  小于等20
      
      stus = Student.objects.filter(Q(s_age__gte=18) | Q(s_age__lte=20))
      print(stus)
      stus = Student.objects.filter(~Q(s_age__gt=18))
      print(stus)
      
      #查询物理成绩大于数学成绩的学生
      stus = Student.objects.all()
      for stu in stus:
          if stu.wuli > stu.math:
              print(stu.s_name)
      stus = Student.objects.filter(wuli__gt=F('math')+10).first()
      print(stus.s_name)
      
  • 最后一句通用的:
      return HttpResponse('查询所有学生信息')
    

上一篇
web后端Django-前戏3关联表操作 web后端Django-前戏3关联表操作
操作背景:是在前戏2中已经创建有学生表,同时也完成了单表的查询,此篇的目的是创建关联表以及相关的关联操作 1.创建拓展表(一对一) 工程文件夹下app下modles.pyclass StudentInfo(models.Model):
2019-01-04
下一篇
非关系型数据库 非关系型数据库
第一部分redis的安装以及挂载1.进入Linux系统或者在服务器中下载文件wget http://download.redis.io/releases/redis-5.0.3.tar.gz 2.解压文件gunzip redis-5.0.3
2019-01-02