美文网首页
Django教程

Django教程

作者: WangLizhi | 来源:发表于2021-07-14 10:16 被阅读0次

    创建项目

    # 创建项目
    django-admin startproject [projectName]
    # 创建模块
    python manage.py startapp [moduleName]
    

    对于Mysql数据库:需要安装pymysql这个第三方库

    安装命令:pip3 install mysqlclient
    

    数据库配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'blog',
            'USER': 'root',
            'PASSWORD': 'root',
            'HOST': '172.0.0.1',
            'PORT': 3306
        }
    }
    

    模型

    5.2 数据查询

    要从数据库检索数据, 首先要获取一个查询集(Query Set) , 查询集表示从数据库获取的对象集合,它可以有零个,一个或多个过滤器。返回查询集的方法,称为过滤器, 过滤器根据给定的参数缩小查询结果范围, 相当于sql语句中where或limit。

    • 在管理器上调用过滤器方法会返回查询集
    • 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
    • 惰性执行; 创建查询集不会带来任何数据库的访问,直到调用数据时,才会访 问数据库 。
    • 以下对查询集求值:迭代、切片、序列化、与if合用 repr() /print(/len() /list() /boo()
    管理器的方法 返回类型 说明
    模型类.objects.all() Query Set 返回表中所有数据
    模型类.objects.filter() Query Set 返回符合条件的数据
    模型类.objects.exclude() Query Set 返回不符合条件的数据
    模型类.objects.order_by() Query Set 对查询结果集进行排序
    模型类.objects.values() Query Set 返回一个Query set, 其中每个对象为一个
    模型类.objects.values_list() Query Set 和values() 基本相同, 但每个对象是一个元
    模型类.objects.reverse() Query Set 对排序的结果反转
    模型类.objects.only(字段) Query Set 只显示指定字段
    类.objects.defer(字段) Query Set 去除指定字段
    模型类.objects.get() 模型对象 + 返回一个满足条件的对象; 如果没有找到符合条件的对象,会引发模型类.Does Not Exist异常 + 如果找到多个,会引发模型 类.Multi Objects Returned异常
    模型类.objects.first() 模型对象 返回第一条数据
    模型类.objects.last() 模型对象 返回最后一条数据
    模型类.objects.earliest () 模型对象 根据指定字段返回最早增加的记录
    模型类.objects.latest(field) 模型对象 根据field字段返回最近增加记录
    模型类.objects.exists() bool 判断查询的数据是否存在
    模型类.objects.count() int 返回查询集中对象的数目
    • all()
    # 获取所有数据 
    对应SQL:select * from User
    users= User.objects.all()
    
    • filter(**kwargs) 返回QuerySet包含与给定查找参数匹配的新查询集。
    等价于:select * from User
    User.objects.filter()
    
    对应SQL:select * from User where username='admin'
    User.objects.filter(username='admin')
    
    对应SQL:select * from User where id >1 and type=2
    User.objects.fileter(id__gt=1, type=2)
    
    对应SQL:select * from User where id >1 and type = 2
    User.objects.filter(id_gt=1).filter(type=2)
    
    • exclude(**kwargs)
    对应SQL:select * from User where username != 2
    User.objects.exclude(username='admin')
    
    • order_by(*fields)
      参数是字段名、可以有多个字段名,默认是升序
      如果要按某个字段降序。在字段名前面加"-": "id"表示按id降序排列
    按照id升序排列 对应SQL:select * from User order by id
    User.objects.order_by('id')
    
    按照id降序排列 对应SQL:select * from User order by id desc
    User.objects.order_by('-id')
    
    按照username升序排列 按照id降序排列 对应SQL: select *from User order by username, id desc
    User.objects.order_by('username', '-id')
    
    • values()
    返回所有字段 对应SQL: select * from User
    User.objects.values()
    
    返回所有数据的username 和 password 字段 对应SQL: select username, password from User
    User.objects.values('username', 'password')
    
    • reverse()
      对排序的结果反转
    对应SQL: select * from User order by id desc
    User.objects.order_by('id').reverse()
    对应SQL: select * from User order by id
    User.objects.order_by('-id').reverse()
    
    • distinct() 去重
    对应SQL: select DISTINCT username from User
    User.objects.values('username').distinct()
    

    5.2.5统计查询

    需要先导入模块:

    from django.db.models import Max, Min, Sum, Avg, Count 
    
    • 聚合查询:对多行查询结果的一列进行操作
    #统计记录总数: select count(*) from user 
    User.objects.aggregate(Count('uid') )           #{'uid_count':4} 
    User.objects.aggregate(Max('uid') )             #{'uid max':5} 
    User.objects.aggregate(Min('uid') )             #{'uid min':2} 
    
    • 分组统计
    # 等价sql:
    select type, count(*) from usergroup by type
    res=User.objects.values('type') .annotate(Count('uid') ) 
    # 统计结果:
    [{"type": :' 普通用户', 'uid count':3} ,{'type':'超级管理员', 'uid count':1} ]
    
    # 查看生成的sql语句 
    print(res.query) 
    
    
    #  此语法忘了没搞明白
    SELECT`user`.`type`, COUNT(`user`.uid`) )AS ; `uid d count t` FROM `user` GROUP BY `user`.`type`ORDER BY NULL
    

    5.2.6 Q对象和F对象

    需要先导入模块:

    from django.db.models import Q,F
    
    • Q对象可以对关键字参数进行封装, 从而更好的应用多个查询, 可以组合&(and) 、I(or) 、~(not) 操作符。
    #原生sql:
    select * from user where uid=2 or uid= 3  
    User.objects.filter(Q(uid=2) | Q(uid=3) ) 
    User.objects.filter(Q(uid gte=2) &Q(uidl te=3) )  
    User.objects.filter(~Q(uid gte=2) ) 
    
    • F对象:用于比较表中两个字段
    #等价sql:
    select * from user where uid<type 
    User.objects.filter(uidl te=F('type') )
    

    相关文章

      网友评论

          本文标题:Django教程

          本文链接:https://www.haomeiwen.com/subject/ehdutltx.html