1. 程式人生 > >django之多表查詢與創建

django之多表查詢與創建

紅樓夢 查找 手機 正向 地址 move *** () div

https://www.cnblogs.com/liuqingzheng/articles/9499252.html

 # 一對多新增數據
    添加一本北京出版社出版的書
    第一種方式
    ret=Book.objects.create(name=紅樓夢,price=34.5,publish_id=1)
    print(ret.name)
    第二種方式,存對象publish=出版社的對象,存到數據庫,是一個id
    publish=Publish.objects.get(id=1)
    pk是主鍵,通過主鍵查找
    publish=Publish.objects.get(pk=1)
    publish 
= Publish.objects.filter(pk=2).first() ret = Book.objects.create(name=西遊記, price=34.5, publish=publish) print(ret.name) 一對多修改數據 book=Book.objects.get(pk=1) # book.publish=出版社對象 book.publish_id=2 book.save() # 方式二 book=Book.objects.filter(pk=1).update(publish=出版社對象) book
=Book.objects.filter(pk=1).update(publish_id=1) 多對多新增 為紅樓夢這本書新增一個叫lqz,egon的作者 lqz=Author.objects.filter(name=lqz).first() egon=Author.objects.filter(name=egon).first() book=Book.objects.filter(name=紅樓夢).first() # add 添加多個對象 book.authors.add(lqz,egon) add添加作者id book.authors.add(
1,2) 刪除 remove,可以傳對象,可以傳id,可以傳多個,不要混著用 book.authors.remove(lqz) book.authors.remove(2) book.authors.remove(1,2) clear清空所有 book.authors.clear() set,先清空,在新增,要傳一個列表,列表內可以是, id,也可以是對象 book.authors.set([lqz,]) ********這樣不行,因為它打散了傳過去了,相當於book.authors.set(lqz) book.authors.set(*[lqz,]) lqz=Author.objects.filter(name=lqz) print(type(lqz)) from django.db.models.query import QuerySet # ***************************基於對象的跨表查詢 ‘‘‘ 一對一 正向 author---關聯字段在author--->authordetail ------> 按字段 反向 authordetail------關聯字段在author--->author -----> 按表名小寫 ‘‘‘ 查詢lqz作者的手機號 正向查詢 author=Author.objects.filter(name=lqz).first() # author.authordetail 就是作者詳情的對象 authordetail=author.authordetail print(authordetail.phone) 查詢地址是 :山東 的作者名字 反向查詢 authordetail=AuthorDetail.objects.filter(addr=山東).first() # authordetail.author 這是作者對象 author=authordetail.author print(author.name) #一對多 ‘‘‘ 一對多 正向 book---關聯字段在book--->publish ------> 按字段 反向 publish------關聯字段在book--->book -----> 按表名小寫_set.all() ‘‘‘ 正向 查詢紅樓夢這本書的出版社郵箱 book=Book.objects.filter(name=紅樓夢).first() # book.publish 就是出版社對象 pulish=book.publish print(pulish.email) 反向 查詢地址是北京 的出版社出版的圖書 publish=Publish.objects.filter(addr=北京).first() # publish.book_set.all() 拿出所有的圖書 books=publish.book_set.all() # 統計一下條數 books=publish.book_set.all().count() print(books) ‘‘‘ 多對多 正向 book---關聯字段在book--->author ------> 按字段.all() 反向 author------關聯字段在book--->book -----> 按表名小寫_set.all() ‘‘‘ #查詢紅樓夢這本書所有的作者 book=Book.objects.filter(name=紅樓夢).first() book.authors.all() #是所有的作者,是一個queryset對象,可以繼續點 print(book.authors.all()) 查詢lqz寫的所有書 lqz=Author.objects.filter(name=lqz).first() books=lqz.book_set.all() print(books) 連續跨表 查詢紅樓夢這本書所有的作者的手機號 book=Book.objects.filter(name=紅樓夢).first() authors=book.authors.all() for author in authors: authordetail=author.authordetail print(authordetail.phone) # ****************************基於對象的查詢---是子查詢也就是多次查詢 # ***************基於雙下劃線的查詢***** # 一對一 查詢lqz作者的手機號 正向查詢 跨表的話,按字段 以author表作為基表 ret=Author.objects.filter(name=lqz).values(authordetail__phone) print(ret) 以authordetail作為基表 反向查詢,按表名小寫 跨表的話,用表名小寫 ret=AuthorDetail.objects.filter(author__name=lqz).values(phone) print(ret) 查詢lqz這個作者的性別和手機號 正向 ret=Author.objects.filter(name=lqz).values(sex,authordetail__phone) print(ret) 查詢手機號是13888888的作者性別 ret=Author.objects.filter(authordetail__phone=13888888).values(sex) print(ret) ret=AuthorDetail.objects.filter(phone=13888888).values(author__sex) print(ret)

django之多表查詢與創建