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')

猜你喜欢

转载自blog.csdn.net/fanlei5458/article/details/80274080