zoukankan      html  css  js  c++  java
  • Django中manger/QuerySet类与mysql数据库的查询

    Django中的单表操作

    1.精确查询

    #查询的结果返回是容器Query Set的函数(Query Set模型类)

    # 1. all()   查询的所有的符合条件的结果,支持正向索引,支持索引切片,不支持反向索引

    user_list = User.objects.all()
    print(type(user_list))
    print(user_list)
    print(user_list.query)
    user = User.objects.all()[0]  # [User: ming]
    user1 = User.objects.all()[-1]  # 不支持AssertionError: Negative indexing is not supported.
    user2 = User.objects.all()[0:2]  # <QuerySet [<User: [User: ming]>, <User: [User: xian]>]>

    # 2. exclude(**kwargs) 查询满足条件对应额对立面的所有结果的list

    user3 = User.objects.exclude(id=2)
    # 该函数相当于将满足条件的记录剔除后返回其他所有记录。    

    # 3. order_by(*field) 查询按照指定的字段条件进行排序后的结果, 'tag_name'代表正序,'-tag_name'代表反序。

    user4 = User.objects.order_by('id')
    print(user4)

    # Query Set 是一个储存查询记录的容器,具备列表的一些操作接口,可以被迭代
    for i in user4:
       print(i)
       
    # 4. reverse() 反转查询结果
    user5 = User.objects.all().reverse()
    # 将查询结果反转

    # 5. count() 显示查询结果的记录的条数,也就是Query Set容器中数据的条数

    n = User.objects.all().reverse().count()
    print(n)

    # 6. exists() 判断查询结果是否存在,值为布尔类型

    res = User.objects.filter(id=7).exists()
    print(res)

    False
    (0.000) SELECT (1) AS `a` FROM `app_user` WHERE `app_user`.`id` = 7 LIMIT 1; args=(7,)

    # 7. values(*field) 按照指定的字段们进行查询,返回存放包含字段们的字典的QuerySet

    user = User.objects.values('name', 'age')
    print(user)

    #对应的sql:   SELECT `app_user`.`name`, `app_user`.`age` FROM `app_user` LIMIT 21; args=()

    <QuerySet [{'name': 'ming', 'age': 25}, {'name': 'xian', 'age': 26}, {'name': 'daidai', 'age': 58}, {'name': 'jeans', 'age': 23}, {'name': 'tenny', 'age': 26}]>

    # 8 values_list(*field) 同values类似,但是返回的记录是以元组存放在Query Set中

    user = User.objects.values_list('name', 'age')
    print(user)
    <QuerySet [('ming', 25), ('xian', 26), ('daidai', 58), ('jeans', 23), ('tenny', 26)]>
    (0.000) SELECT `app_user`.`name`, `app_user`.`age` FROM `app_user` LIMIT 21; args=()

    # 9 distinct(*field) 将其他的查询结果剔除重复的字段,括号内是字段名
    user = User.objects.values('name', 'age').distinct('name')

     

    2.用manger类实现的增删查改

    # 增
    user = User.objects.create(name='xiaojin', age=24, birthday='2018-12-12')
    print(type(user))
    print(user)
    # <class 'app.models.User'>
    # [User: xiaojin]

    user = User(name='Zero', age=8, birthday='2010-06-01')
    user.save()

    # 查
    # 操作的结果拥有是一个list
    users = User.objects.filter(name='Owen')

    # 只能操作有且只有一条数据的记录
    user = User.objects.get(id=1)

    #改
    User.objects.filter(name='Owen').update(name='Owen_best')

    users = User.objects.filter(name='Owen_best')
    for user in users:
       user.name = 'Owen'
       user.save()
       
    #删
    User.objects.filter(name='Owen').delete()

    user = User.objects.filter(name='Zero').first()
    user.delete()

     

    3.模糊查询

    user_list = User.objects.filter(id__gte=1)

    # 整型相关
    age__exact=8  # 确切匹配8
    age__in=[8, 10]  # 8或10
    age__gt=8  # 大于8
    age__gte=8  # 大于等于8
    age__lt=8  # 小于8
    age__lte=8  # 小于等于8
    age__range=[8, 10]  # 8到10之间
    age__isnull=0|1  # 0:is not null | 1:is null

    # 字符串相关
    name__startswith  # 后方模糊匹配
    name__endswith  # 前方模糊匹配
    name__contains  # 前后方均模糊匹配
    name__regex  # 正则匹配
    name__istartswith  # 不区分大小写后方模糊匹配(i开头就是不区分大小写)

    # 时间相关
    birthday__year=2008  # 时间年份模糊匹配

     

    4.特殊字查询(F、Q查询)

    # 特殊字的查询首先要导入django中的模型类中的F,Q
    from django.db.models import F,Q

    # F查询(计算查询,基于计算的)
    # 需求一:将所有人的年龄加1
    User.objects.all().update(age=F('age')+1)

    # 需求二:将所有年龄的1/4等于id的记录查询出来
    res = User.objects.filter(id=F('age')/4).exists()

    # Q查询
    # Q基于关系 Q('字段条件')
    # 与
    User.objects.filter(Q(id=1) & Q(age=10))  # id=1 并且 age=10
    # 或
    User.objects.filter(Q(id=1) | Q(id=2))  # id=1 或 id=2
    # 非
    User.objects.filter(~Q(id=1))  # id 不为 1
  • 相关阅读:
    c#中的对象生命周期
    数据抓取的艺术(三):抓取Google数据之心得
    redmine3.3.0安装问题
    wget 无法建立ssl连接 [ERROR: certificate common name ?..ssl.fastly.net?.doesn?. match requested host name ?.ache.ruby-lang.org?. To connect to cache.ruby-lang.org insecurely, use ?.-no-check-certificate?]
    Centos安装ruby
    Redmine插件的安装与卸载,知识库插件安装。
    Nexus网页直接上传jar包
    mvn deploy命令上传包
    一辈子只有1次成为BAT的机会,你如何把握?
    redmine创建新闻,自动发邮件给项目组所有成员
  • 原文地址:https://www.cnblogs.com/5j421/p/10479733.html
Copyright © 2011-2022 走看看