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'}]>

 

posted @ 2017-11-30 09:34  谷子的  阅读(369)  评论(0编辑  收藏  举报