1. 程式人生 > 實用技巧 >Django 兩張表的正向查詢和反向查詢

Django 兩張表的正向查詢和反向查詢

Django的多表查詢

假設有模型

 class Category(models.Model):
   id = models.CharField(primary_key = True,max_length = 255)
   type_name = models.CharField(max_length = 255)
   def __str__(self):
       return self.id+"."+self.type_name
   class Meta:
       db_table = "category"

class BookList(models.Model):
   name = models.CharField(primary_key = True,max_length = 255) #書名
   author = models.CharField(max_length = 255)                 #作者
   read_num = models.CharField(max_length = 255)                  #閱讀人數
   book_type = models.ForeignKey(Category, models.DO_NOTHING)  #外來鍵 ,書的類別
   
   class Meta:
       db_table = "booklist"
  • 正向查詢就是查詢物件的主體是Category,要查詢Category模型對應表裡的資料
  • 反向查詢就是查詢物件的主體是Category,要查詢的是BookList裡的資料

正向查詢

 t = models.Category.objects.filter()
 >>> <QuerySet [<Category: 1.玄幻魔法>, <Category: 2.武俠修真>, 
 <Category: 3.都市言情>, <Category: 4.歷史穿越>, <Category: 5.恐怖懸疑>, 
 <Category: 6.遊戲競技>,
 <Category: 7.軍事科幻>, <Category: 8.女生頻道>]>

反向查詢

 t[0].booklist_set.values("name")
>>> <QuerySet [{'name': '七世悟道'}, {'name': '關於在異界求生這件小事'}, {'name': '刀鎮星河'}, {'name': '變身之女俠時代'}, {'name': '吾名丹尊萬木'}, {'name':
'基因販賣商'}, {'name': '天地霸體訣'}, {'name': '天革'}, {'name': '天驕狂尊'}, {'name': '太古魂帝'}, {'name': '守域奇緣'}, {'name': '悲劇發生前[快穿]'}, {'name': '我有一張沾沾卡'}, {'name': '我的絕美御姐老婆'}, {'name': '我的美女俏老婆'}, {'name': '我的鉚鋼蒸汽時代'}, {'name': '戰道天圖'}, {'name': '無敵從滿級屬性開始'}, {'name': '極品朋友圈'}, {'name': '殘魄御天'}, '...(remaining elements truncated)...']>.

反向查詢的更簡單的步驟,可以使用select_related方法實現

 #t = model.Category.objects.select_related("type_name").values("name")