1、基於雙下劃線的跨表查詢linux
Django 還提供了一種直觀而高效的方式在查詢(lookups)中表示關聯關係,它能自動確認 SQL JOIN 聯繫。要作跨關係查詢,就使用兩個下劃線來連接模型(model)間關聯字段的名稱,直到最終連接到你想要的 model 爲止。(至關於用sql語句用join鏈接的方式,能夠在settings裏面設置,可查看sql語句)git
數據庫模型:sql
class Book(models.Model): nid = models.AutoField(primary_key=True) # 自增id(能夠不寫,默認會有自增id) title = models.CharField(max_length=32) publishDdata = models.DateField() # 出版日期 price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留兩位小數 #一個出版社有多本書,關聯字段要寫在多的一方 # 不用命名爲publish_id,由於django爲咱們自動就加上了_id publish = models.ForeignKey("Publish") #foreignkey(表名)創建的一對多關係 # publish是實例對象關聯的出版社對象 authorlist = models.ManyToManyField("Author") #創建的多對多的關係 def __str__(self): #__str__方法使用來吧對象轉換成字符串的,你返回啥內容就打印啥 return self.title class Publish(models.Model): #不寫id的時候數據庫會自動給你增長自增id name =models.CharField(max_length=32) addr = models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() class AuthorDeital(models.Model): tel = models.IntegerField() addr = models.CharField(max_length=32) author = models.OneToOneField("Author") #創建的一對一的關係
一對多查詢:數據庫
一、查詢人民出版社出版過的全部的書的價格和名字django
# 基於雙下劃線的方式查詢1================一對多 # 第一種查法 ret = models.Publish.objects.filter(name="人民出版社").values("book__price","book__title") // 反向查詢時,表名__字段,例如:book__price print(ret) # 第二種查法 ret2 = models.Book.objects.filter(publish__name="人民出版社").values("price","title") // 正向查詢時,外鍵字段__關聯表的字段,例如:publish__name print(ret2)
二、查詢linux這本書的出版社的地址:filer先過濾,,values顯示要求的字段spa
第一種查法 ret = models.Book.objects.filter(title="linux").values("publish__addr") // 正向查詢時,外鍵字段__關聯表的字段,例如:publish__addr print(ret) 第二種查法 ret2 = models.Publish.objects.filter(book__title="linux").values("addr") // 反向查詢時,表名__字段,例如:book__title print(ret2)
多對多查詢:code
一、查詢egon出過的全部書的名字對象
#方式一 ret = models.Author.objects.filter(name="egon").values("book__title") // 反向查詢時,表名__字段 print(ret) #方式二:兩種方式也就是邏輯不同 ret2 = models.Book.objects.filter(authorlist__name="egon").values("title") // 正向查詢時,外鍵字段__字段 print(ret2)
二、查詢手機號以151開頭的做者出版過的全部書的名稱以及出版社的名稱blog
# 方式一: author_obj = models.AuthorDeital.objects.filter(tel__startswith="151").first() print(author_obj.author.book_set.all().values("title","publish__name")) # 方式二: ret = models.Book.objects.filter(authorlist__author_deital__tel__startswith="151").values("title","publish__name") print(ret)