数据查询

3.18 数据查询

3.18.1 两个字段之间的对比
首先需要导入
from django.db.models import F


def choicebook(request):
    # F()解决属性与属性的对比,两个字段之间的关系
    # 查找阅读量大于销量的书
    ret1 = BookInfo.objects.filter(count__gt=F('seltcount'))
    print(ret1)
    # 查找销量是两倍阅读量的书
    ret2 = BookInfo.objects.filter(seltcount__exact=F('count')*2)
    print(ret2)

    # 查找销量是两倍阅读量的书,并且阅读量不为0
    ret3  = BookInfo.objects.filter(seltcount__exact=F('count')*2,seltcount__gt=0)
    print(ret3)
    # 第二种写法,是通过使用多个过滤器来模拟逻辑与关系,类似where条件中的and
    ret4 = BookInfo.objects.filter(seltcount__exact=F('count') * 2).filter(seltcount__gt=0)
    print(ret4)
    return HttpResponse('这是查找数据')


展示:
<QuerySet [<BookInfo: xas>]>

<QuerySet [<BookInfo: 西游记>, <BookInfo: 红楼梦>, <BookInfo: 三国演义>, <BookInfo: 水浒传>, <BookInfo: wo>, <BookInfo: 我写的>]>

<QuerySet [<BookInfo: 我写的>]>

<QuerySet [<BookInfo: 我写的>]>

注意点:
F对象是用来两个属性之间的对比

3.18.2 各个关系的与或非操作
首先需要导入
from django.db.models import Q


def choicebook(request):
    # todo 实现逻辑的或关系,也就是or
    # Q是逻辑关系
    # 找出销量大于0的书籍
    ret5 = BookInfo.objects.filter(seltcount__gt=0)
    ret6 = BookInfo.objects.filter(Q(seltcount__gt=0))
    print('ret5',ret5)
    print('ret6',ret6)

    #查找销量大于0 或者 阅读量小于0的书籍
    ret7 = BookInfo.objects.filter(Q(seltcount__gt=0) | Q(count__lt=0))
    print('ret7',ret7)

    # 查找销量大于0 且 阅读量小于0的书籍
    ret8 = BookInfo.objects.filter(Q(seltcount__gt=0) & Q(count__lt=0))
    print('ret8',ret8)

    # 查找销量不等于0的书籍
    ret9 = BookInfo.objects.filter(~Q(seltcount__exact=0))
    print('ret9',ret9)
	return HttpResponse('这是查找数据')



展示:
ret5 <QuerySet [<BookInfo: 我写的>]>
ret6 <QuerySet [<BookInfo: 我写的>]>
ret7 <QuerySet [<BookInfo: 我写的>, <BookInfo: 再来一本>]>
ret8 <QuerySet []>
ret9 <QuerySet [<BookInfo: 我写的>]>

注意点:
Q对象用来表示各个关系的与或非的操作,  &   |   ~
3.18.3 聚合函数
from django.db.models import Sum,Avg,Count,Min,Max,StdDev

def choicebook(request):	
    # todo 尝试聚合函数
    print('#######')
    ret10 = BookInfo.objects.count()
    print('ret10',ret10)

    #查找阅读量的总和
    ret11 = BookInfo.objects.aggregate(Sum('count'))
    print('ret11',ret11)
    return HttpResponse('这是查找数据')
    
    
展示:
#######
ret10 8
ret11 {'count__sum': 100}

3.18.4 排序
def choicebook(request):
    #查询书籍并且以销量排序
    ret12 = BookInfo.objects.all().order_by('seltcount')
    print('ret12',ret12)
    return HttpResponse('这是查找数据')
    
展示:
ret12 <QuerySet [<BookInfo: 西游记>, <BookInfo: 红楼梦>, <BookInfo: 三国演义>, <BookInfo: 水浒传>, <BookInfo: wo>, <BookInfo: xas>, <BookInfo: 再来一本>, <BookInfo: 我写的>]>

3.18.5 存在外键的两表关联查询
3.18.5.1 一对多
def bookinfo1(request):
    # todo 访问的时候,由少的一方访问多的一方 由一到多
    # 1、先查询出需要查的书籍
    try:
        book = BookInfo.objects.get(bookname='西游记')
        print(book)
        # 2、通过书籍查找该书籍中的人物
        peoples = book.personinfo_set.all()
        print('西游记', peoples)
    except Exception as e:
        print(e)
        
    return HttpResponse('OK')
        

展示:
西游记
西游记 <QuerySet [<PersonInfo: 孙悟空>, <PersonInfo: 唐僧>, <PersonInfo: 猪八戒>, <PersonInfo: 沙僧>]>

3.18.5.2 多对一
def bookinfo1(request):
    # todo 由多的一方查找少的一方
    try:
        obj = PersonInfo.objects.get(pname='孙悟空')
        print(obj)
        print(obj.book)
        print(obj.book_id)
        print(obj.book.id)
    except Exception as e:
        print(e)
       
    return HttpResponse('OK')


展示:
孙悟空
西游记
1
1

3.18.5.3 关联过滤查询
def bookinfo1(request):
    
	# todo 关联过滤查询
    # 查询人物为孙悟空的书籍
    '''
    select * from bookinfo where id=(select book_id from personinfo where pname='孙悟空')
    '''

    obj1 = PersonInfo.objects.get(pname='孙悟空')
    print(obj1.book_id)
    book_obj = BookInfo.objects.get(id=obj1.book_id)
    print(book_obj)


    # 关联模型类的小写——属性名——条件筛选运算符=值
    book_obj2 = BookInfo.objects.filter(personinfo__pname__exact='孙悟空')
    print(book_obj2)

    #todo 图书销量大于0的人
    person_obj = PersonInfo.objects.filter(book__seltcount__gt=0)
    print(person_obj)

    return HttpResponse('OK')


展示:
1
西游记
<QuerySet [<BookInfo: 西游记>]>
<QuerySet []>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值