zoukankan      html  css  js  c++  java
  • diango 的一对多,多对多的添加方式,绑定方法,。value方法,valuelist方法,双下划线的查询

    本编博客前言总结,

    在一对多,和多对多的查询,有   表名_set 方法,和   表名__(双下划綫)字段名  方法。 

    表名_set 方法  :用于反向查询,

    表名__(双下划綫)字段名   :最为一个条件查询

    ===========

    在views视图函数中,利用双下划线的单表查询,

    id__gt=2  ,id大于2的字段值都打印出来

    title__contains='python‘,关键字查询,包含python的title字段都打印出来

    def query(request):
    
    
        #双下划线--- 单表查询
        query_list = Publish.objects.filter(id__gt=1)#查询id大于1的出版社
    
        # print(query_list)
        #<QuerySet [<Publish: 河下出版社 洛阳>, <Publish: 清华出版社 北京>, <Publish: 人民出版社 昌平>]>
    
        #包含contains ,写上关键字
        book = Book.objects.filter(title__contains='')#得到可能是一个集合对象,包含多个对象
        # print(book)
        #<QuerySet [<Book: 项塔兰>]>
    
        return HttpResponse('oookkk')

    -----

    values() 方法,查询字段的值,得到一个字典格式,key字段,value是对应的值

    #  values 查询方法,就是字段对应的值,
    
    
    def query_value(request):
    
        b1 = Book.objects.values('title')#title值字段
        # print(b1)  #得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值,
        #< QuerySet[{'title': 'Linux'}, {'title': '项塔兰'}, {'title': '追风筝的人'}, {'title': '富爸爸'}] >
    
        b2 = Book.objects.values('title','price')#可以加多个字段
        # print(b2)
        #< QuerySet[{'title': 'Linux', 'price': Decimal('30.00')},
        # {'title': '项塔兰', 'price': Decimal('45.00')},
        # {'title': '追风筝的人', 'price': Decimal('39.90')},
        #  {'title': '富爸爸', 'price': Decimal('23.00')}] >
    
    
    
        b3 = Book.objects.filter(id__gt=4).values('title')#查询id大于4,的title,得到一个对象集合,显示书名
        #<QuerySet [{'title': '富爸爸'}]>
        # print(b3)

    ----

    values_list()方法,得到是元组形式字段值

    exclude()排除括号里的,条件,

     # ----valuelist 方法查询  ,得到一个元组格式数据,只有字段的值,
        b4 = Book.objects.filter(id__gt=3).values_list('title')
        # print(b4)   #得到一个
         #<QuerySet [('追风筝的人',), ('富爸爸',)]>
    
        b5 = Book.objects.exclude(id__gt=3)#exclude  排除 ,查询id大于4的以外的书籍,<QuerySet [<Book: Linux>, <Book: 项塔兰>]>
    
        b6 = Book.objects.filter(id__lt=4)# 查询id小于4 的书籍 <QuerySet [<Book: Linux>, <Book: 项塔兰>]>
    
        # print(b5)
        # print(b6)  #b5 和b6 得到结果一样,

    ----

    一对多,多对多,正向查询和方向查询

    2张表产生关系一张表有关联表的字段,查询关联表就是正向

    另一张没有关联的字段,但已经有关联关系,就可以方向查询,用  要查的表名的小写__set就可以

    def relationquery(request):
    
        #一对多的关系查询,先得到多的对象,然后调用关联的 一 的表的字段,就得到字段的值,
        #查询Linux的出版社的地址
        book_obj = Book.objects.filter(title = "linux")[0]
    
        #book_obj.publish是一条出版社对象,然后调用自己的属性,就是自己的字段
    
        print(book_obj.publish.addr)#北京
    
        #用sql语句查询,子查询,把一个结果作为一个条件查询
    
        #select addr from publish where id=(select publish_id from Book where title='linux')
    
    
        #多对多的查询
        #找Linux这本书的所有作者名字
    
        linux_obj = Book.objects.filter(title = 'linux').first()
    
        #利用Book表中authors表,获取所有的对象
        author_list = linux_obj.authors.all()
    
        # for obj in author_list: #循环得到每个对象的名字
        #     print(obj.name)
    
        # egon
        # alex
        # yuan
        # oldboy
    
        #反向查询,出版社没有书籍表的字段,用反向查询- _set
        #查询北京出版社出版的所有书籍
    
        pub = Publish.objects.filter(name = '北京出版社')[0]
        # print(pub.book_set.all())#<QuerySet [<Book: Linux>]>
    
        #正向查
        pid = Publish.objects.filter(name = '北京出版社')[0]
        # print(Book.objects.all(publish_id=pid))#<QuerySet [<Book: Linux>]>
    
        #反向绑定
        # author1 = Author.objects.add(name = 'yuan')
        #
        # author1.book_set.add(*Book.objects.all())#给yuan 绑定了所有的书籍关系
    

    values ,filter,和双下划线的使用,多对多表的表查询,一对多表查询

        #value ,filter,双下划线,使用
        #查询Linux出版社的地址
    
        #publish__addr,publsih是Book表的字段,__ 是固定语法,addr是PUblish字段
        ret2 = Book.objects.filter(title='linux').values('publish__addr')
        print(ret2)#<QuerySet [{'publish__addr': '北京'}]>
    
    
        #查询Linux的所有作者
        ret3 = Book.objects.filter(title='linux').values('authors__name')
        print(ret3)
        #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]>

     一对多,多对多的反向查询

        #用反向的方法查一对多,
        #用PUblish表查询出版过Linux这本书的出版社名字,用反向查book__title,book 是Book表的表名小写,加上Book表的字段
        ret3 = Publish.objects.filter(book__title='linux').values('name')
        # print(ret3)#<QuerySet [{'name': '北京出版社'}]>
    
    
        #用反向的方法查询多对多
        # 查询Linux的所有作者的名字
        ret4 = Author.objects.filter(book__title='linux').values('name')
        # print(ret4)#<QuerySet [{'name': 'egon'}, {'name': 'alex'}, {'name': 'yuan'}, {'name': 'oldboy'}]>
    
        #正向查询
        #查询Linux的所有作者
        ret3 = Book.objects.filter(title='linux').values('authors__name')
        # print(ret3)
        #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]>
    
        #查询书籍价格大于40的作者
    
        #正向
        ret5 = Book.objects.filter(price__gt=40).values('authors__name')
        print(ret5)
        #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]>
    
        #反向
        ret6 = Author.objects.filter(book__price__gt=40).values('name')
        print(ret6)
        #<QuerySet [{'name': 'egon'}, {'name': 'alex'}, {'name': 'yuan'}, {'name': 'yuan'}, {'name': 'oldboy'}]>
  • 相关阅读:
    Silverlight文本元素—高级修饰
    C#常用集合总结2
    Silverlight图片处理——(伸展,裁剪,蒙版)
    选择“Asp.Net Web应用程序”还是“Asp.Net网站”?
    HTML5能给软件初学者带来什么呢?
    性格的弱点
    (原)jvoiplib中的examples的编译和运行
    开源的好东西
    C++编绎器编绎C语言的问题
    gcc生成静态库和动态库(转自http://blog.csdn.net/ast_224/archive/2009/03/13/3988244.aspx)
  • 原文地址:https://www.cnblogs.com/gyh04541/p/7927390.html
Copyright © 2011-2022 走看看