zoukankan      html  css  js  c++  java
  • python+Django框架运用(三)

    Django模型

    模式指的是根据数据库中数据表的结构来创建出来的class,每一张表到Python中就是一个

    class,表中的每一个列,到Python中就是class的一个属性。

    在模型中可以完成对数据库的增删改查操作

    创建和使用模型 --ORM(对象关系映射)

    三大特征:

      1、数据表到类的映射

        将数据表自动生成一个class类

        同时也可以将一个class类自动生成一张数据表

      2、数据类型的映射

        可以将表中的字段数据类型字段映射到Python中对应的数据类型

        反之同样

      3、关系映射

        在Python中可以将表与表之间的关系映射出来

        表与表之间的关系也可以自动映射到Python中的class

        数据表之间的关联关系:一对一、一对多、多对多

    创建和配置数据库

    1、先在数据库中创建一个库(mysql)

      create database 库名 default utf8;

    2、配置数据库(在Django项目中settings.py中)

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  #引擎
            'NAME': 'myitem',    # 库名
            'USER': 'laige',  # 用户名
            'PASSWORD': '123456',  # 密码
            'HOST': '172.16.2.178',  # 数据库服务器地址
            'PORT': 3306,  # 端口
        }
    }        

    Django中连接Mysql需要依赖于pymysql,在项目主目录中__init__.py增加:

    import pymysql
    pymysql.install_as_MySQLdb()

    编写Models

    在应用的models.py文件中定义与数据表对应的class

    文件中的每个class类都称为模型类、实体类,每个实体类必须继承自models.Model

    from django.db import models
    
    
    # 定义一个实体类Users
    class Users(models.Model):
        # 对应数据表中name字段,数据类型varchar(20)
        name = models.CharField(max_length=20)
        # 对应数据表中password字段,数据类型varchar(30)
        password = models.CharField(max_length=30)
        # 对应数据表中email字段,数据类型varchar(254)
        email = models.EmailField()
        # 对应数据表中age字段,数据类型int()
        age = models.IntegerField()

    数据库的同步

    在models.py中编写好实体类后,需要同步到数据库中

    1.在控制台终端进入项目主目录,执行:

      ./manage.py  makemigrations

      作用:将每个应用下的models.pu文件生成一个数据库中间文件,保存在migrations目录

    2.继续执行:

      ./manage.py  migrate

      作用:将每个应用下的migrations目录中的中间文件同步到数据库中

    模型的字段类型与字段选项

    常用的字段类型:

      BooleanField()    -->布尔类型,实际就是数据库中的tinyint(1)类型

      CharField()       --> 字符串类型

      DataField()       --> 日期类型

      DataTimeField()    --> 日期时间类型

      EmailField()     --> 存放电子邮箱

      FloatField()      --> 浮点型

      ImageField()       --> 存放图片路径

      IntergerField()    --> int整数型

      更多的字段类型,参考文档:https://docs.djangoproject.com/en/2.0/ref/models/fields

    常用字段选项:

      max_length    --> 指定最大长度,CharField()必须设置

      default      --> 设置当前字段的默认值

      null        --> 指定当前字段是否允许为空,默认是False

      更多的字段选项,参考文档:https://docs.djangoproject.com/en/2.0/ref/models/fields

    模型中的增删改查

    1、增加数据,三种方式:

    # 增加数据
    def add_views(request):
        # 方式一:
        # 向author表中新增数据,Author是一个实体类(导入models.py)
        # Author.objects.create(names='朱自清', age=80)
        Author.objects.create(names='土豆', age=37,email='tudou@163.com')
        Author.objects.create(names='净无痕', age=35, email='jing@163.com')
        Author.objects.create(names='耳根', age=40, email='ergeng@163.com')
        Author.objects.create(names='西红柿', age=50, email='ergeng@163.com')
        Author.objects.create(names='唐家三少', age=46, email='ergeng@163.com')
        Author.objects.create(names='焖面', age=57, email='ergeng@163.com')
    
        # 方式二:
        # 创建一个Models对象,通过对象的save()完成增加
        obj = Author(names='老舍', age=65)
        obj.save()
    
        # 使用字典构造对象, 通过save()完成增加
        dic = {
            'names': '李白',
            'age': 35
        }
        obj = Author(**dic)
        obj.save()
    
        return HttpResponse('新增成功!')

    2、修改数据:

    # 修改数据
    def update_views(request):
        # 修改单个数据(三步)
        # 1.通过get()得到要修改的实体对象
        # 2.通过实体对象的属性修改属性值
        # 3.再通过实体对象的save()保存回数据库
        au = Author.objects.get(id=1)
        au.names = '一叶知秋'
        au.save()
    
        # 批量修改数据(慎用)
        # 调用查询结果集的update()完成批量修改
        Author.objects.all().update(age=18)
    
        return HttpResponse('修改成功!')

    3、删除数据:

    # 删除数据
    def delete_views(request, user_id):
      # 调用实体对象/查询结果集的 delete()
      # 删除单个
      # obj = Author.objects.get(id=1)
      # obj.delete()
      # 删除多个
      # Author.objects.all().delete()
    
      # obj = Author.objects.get(id=user_id)
      # obj.delete()
    
      # 逻辑删除
      au = Author.objects.get(id=user_id)
      au.isActive = False
      au.save()
    
      # 转发(一次请求)
      # return aulist_views(request)
    
      # 重定向(重新向指定的url发送请求)
      return HttpResponseRedirect('/login/')

    4、查看数据:

    # 查询数据
    def query_views(request):
      # 方式一(查询所有):
      # 查询表中所有数据,相当于select * from 表名;
      auList = Author.objects.all()
      print(auList)
      # 返回的数据,是一个对象的列表,可以迭代出对象遍历出值
      # < QuerySet[ < Author: Author object >, < Author: Author object >, < Author: Author object >] >
      for au in auList:
        print('作者姓名:', au.names)
        print('作者年龄:', au.age)
    
      # 方式二(查询指定字段):
      # 查询表中部分字段数据,等同于select names,age from 表名;
      auList = Author.objects.values('names', 'age')
      print(auList)
      # 返回的数据是查询的字段(字典,字段名:值)组成的列表
      for au in auList:
        print('作者姓名:', au['names'], '作者年龄:', au['age'])
    
      #############################################
    
      # 数据排序(默认是升序)
      # 按照age字段进行排序
      auList = Author.objects.order_by('age')
      print('#######升序#####')
      for au in auList:
        print(au.id, au.names, au.age)
      # Author.objects.order_by('-id')
      # 按照age字段进行降序排序
      auList = Author.objects.all().order_by('-age')
      print('######降序#######')
      for au in auList:
           print(au.id, au.names, au.age)
    
    
      #############################################
      # 对条件取反,等同于select * from 表名 where not (id=3)
      print('######条件取反######')
      auList = Author.objects.exclude(id=3)
      for au in auList:
           print(au.id, au.names, au.age)
    
      # 等同于 select * from author where not (id=3 and age=80)
      Author.objects.exclude(id=3, age=80)
    
      ##############################################
      # 根据条件查询部分行(重难点)
      # 等同于select * from author where id=1
      Author.objects.filter(id=1)
      # 等同于select * from author where id=1 and names='老舍'
      Author.objects.filter(id=1, names='老舍')
    
      # 通过Field Lookup(查询表达式)完成复杂条件的构建
      # __exact 表示精确查询
      Author.objects.filter(names__exact='朱自清')
    
      # __contains 筛选出属性中包含关键字的记录
      # 等同于 select * from author where names like '%三少'
      auList = Author.objects.filter(names__contains='三少')
      print(auList[0].names)
    
      # __lt 和 __lte 分别表示筛选出属性值小于和小于等于指定值得记录
      # __gt 和 __gte 分别表示筛选出属性值大于和大于等于指定值得记录
      # 等同于 select * from author where age < 80
      Author.objects.filter(age__lt=80)
      # __startswith 筛选出以指定关键字开始的记录
      # 等同于 select * from names like '朱%'
      Author.objects.filter(names__startswith='')
      # __endswith 筛选出以指定关键字结尾的记录
      # 等同于 select * from names like '%三少'
      auList = Author.objects.filter(names__endswith='三少').values('names', 'age')
      for au in auList:
        print('作家姓名:', au['names'])
        print('作家年龄:', au['age'])
    
      ##############################################
      # 查询只返回一条数据(该函数只适用于返回一条记录时使用)
      Author.objects.get(id=1)
    
      return HttpResponse('查询成功!')

    下面还有几个特殊操作:

    1、F操作 和 Q操作

    from django.db.models import F, Q
    
    
    def doF_views(request):
      # 修改所有人的年龄全部加10岁
      # F操作, 在执行操作时获取某列的值(脱离操作无效)
      Author.objects.all().update(age=F('age')+10)
      return HttpResponseRedirect('/index/')
    
    
    def doQ_views(request):
      # Q操作, 在查询条件中实现或(or)的功能
      # 等用于 select * from author where (id=8 or age>=50) and isActive=True;
      auList = Author.objects.filter(Q(id=8) | Q(age__gte=50), isActive=True)
      return render(request, 'index.html', locals())

    2、原生数据库操作:

    def raw_views(request):
      sql = 'select * from index_author where id>=9'
      auList = Author.objects.raw(sql)
    
      for au in auList:
        print(au.names, au.age)
      return HttpResponse('Execute raw success!')

    ps: 这里补充一点内容,重定向:

      意思就是想新的地址发送请求(服务器端)

      from django.http import HttpResponseRedirect

      return HttpResponseRedirect(url)

    未完待续....

  • 相关阅读:
    Intellij Idea 创建Web项目入门
    使用swagger作为restful api的doc文档生成
    SpringMVC中的参数绑定总结
    Spring注解@Resource和@Autowired区别对比
    java的(PO,VO,TO,BO,DAO,POJO)解释
    java有几种对象(PO,VO,DAO,BO,POJO)
    clone项目到本地
    修改虚拟机上Linux系统的IP地址
    虚拟机下CentOS 6.5配置IP地址的三种方法
    系统重启
  • 原文地址:https://www.cnblogs.com/hxgoto/p/9322646.html
Copyright © 2011-2022 走看看