• DJango视图查询,F,Q对象,聚合函数


    查询

    (文章末尾附上了该视图views.py对应的模型类models.py内容)
    查询集

    1.查询集表示从数据库中获取的对象集合
    2.查询集可以含有零个、一个或多个过滤器
    3.过滤器基于所给的参数限制查询的结果
    4.在管理器上调用过滤器方法会返回查询集
    5.查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
    6.惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
    7.何时对查询集求值:迭代,序列化,与if合用
    8.返回查询集的方法,称为过滤器
        all()       
        filter()
        exclude()
        order_by()
        values()
    9.过滤器书写格式:
        filter(键1=值1,键2=值2) 等价于下面
        filter(键1=值1).filter(键2=值2)
        高级使用方法见下面比较运算符
    10.查询集返回的是一个类列表,可以使用下标可以获取对应的对象,也支持切片,但不支持负下标
    
    查询返回单个值
    get():返回单个满足条件的对象
        如果未找到会引发"模型类.DoesNotExist"异常
        如果多条被返回,会引发"模型类.Multiple    ObjectsReturned"异常
    count():返回当前查询的总条数
    first():返回第一个对象
    last():返回最后一个对象
    exists():判断查询集中是否有数据,如果有则返回True
    

    比较运算符

    配合过滤器filter()、exclude()、get()使用
        格式:属性名称__比较运算符=值
    exact:表示判断是否等于
    contains:包含
    startswith,endswith:以value开头或结尾
    上面的参数默认是大小写敏感的,在前面加个i可以忽略大小写如:iexact,icontains、istarswith、iendswith
    
    isnull、isnotnull:是否为null
    in:是否包含在范围内
    in:是否包含在范围内
    year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
    

    代码示例

        # 查询英雄表中,hcontext字段中包含‘九’的所有信息
        # list_info = HeroInfo.objects.filter(hcontent__contains='九')
    
        # 查询英雄表中,没有被逻辑删除的所有数据,filter:过滤
        # list_info = HeroInfo.objects.filter(isDelete=False)
        # 列表list_info包含的数据个数
        # count = list_info.count()
    
        # 排除名字以 ‘风’ 结尾的,exclude:排除
        # list_info = HeroInfo.objects.exclude(hname__endswith='风')
    
        # 名字不是空的
        # list_info = HeroInfo.objects.filter(hname__isnull=False)
    
        # gt、gte、lt、lte:大于、大于等于、小于、小于等于;
        # in: 是否包含在in的范围内,主键写id或者pk都可以
        # list_info = BookInfo.books.filter(id__in=[1,2])
        # list_info = HeroInfo.objects.filter(pk__in=[18,19,20])
    
        # 跨关联查询,查询书中的英雄的内容中包含‘九’的书。
        list_info = BookInfo.books.filter(heroinfo__hcontent__contains='九')
    
        context = {'list':list_info}
        return render(request, 'booktest/index.html', context)

    聚合函数

    使用aggregate()函数返回聚合函数的值
    聚合函数:Avg,Count,Max,Min,Sum
    聚合函数在查询集的最后面写,Count不用aggregate()返回值,可以直接调用

    list_info = HeroInfo.objects.exclude(hname__endswith='风')
    max = list_info.aggregate(Max(pk))
    count = list_info.count()

    F 对象

    用来比较一个字段和另一个字段的值,即一个对象的一个属性和另一个属性的值.

    # books是BookInfo的类属性保存的自定义的一个管理类的对象.
    # 查询阅读量大于评论量的对象
    result = BookInfo.books.filter(bread__gt=F('bcommet'))

    Q 对象,

    过滤器的方法中关键字参数查询,可以实现多个条件的逻辑或

    或查询
    BookInfo.books.filter(Q(判断一) | Q(判断2))
    与查询
    result = BookInfo.books.filter(pk__lt=5,(bcommet__lt=10)
    

    模型类内容

    # models.py
    from django.db import models
    
    class BookInfoManage(models.Manager):
        def get_queryset(self):
            return super(BookInfoManage,self).get_queryset().filter(isDelete=False)
    
    class BookInfo(models.Model):
        btitle = models.CharField(max_length=20)
        bpub_date = models.DateTimeField(db_column='pub_date')
        bread = models.IntegerField(default=0)
        bcommet = models.IntegerField(default=0)
        isDelete = models.BooleanField(default=False)
        books = models.Manager()
        books2 = BookInfoManage()
        class Meta():
            db_table = 'bookinfo'
    
        def __str__(self):
            return self.btitle.encode('utf-8')
    
    class HeroInfo(models.Model):
        hname = models.CharField(max_length=20)
        hgender = models.BooleanField(default=True)
        hbook = models.ForeignKey('BookInfo')
        hcontent = models.CharField(max_length=100)
        isDelete = models.BooleanField(default=False)
    
        def __str__(self):
            return self.hname.encode('utf-8')
    
  • 相关阅读:
    Codeforces Round #629 (Div. 3) (A ~ F)
    st表
    Educational Codeforces Round 81 (Rated for Div. 2)
    hihocoder#1996 : 01匹配
    P2056 [ZJOI2007]捉迷藏
    P2495 [SDOI2011]消耗战
    GUETOJ1335
    优先队列重载比较运算
    CCF认证201909-4 推荐系统
    P3178 [HAOI2015]树上操作
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235469.html
Copyright © 2020-2023  润新知