在數據庫有外鍵的時候,使用 select_related() 和 prefetch_related() 可以很好的減少數據庫請求的次數,從而提高性能。本文通過一個簡單的例子從QuerySet觸發的SQL語句來分析工作方式,從而進一步瞭解Django具體的運作方式。
0.初始化
打開log調試,在setting中加入
LOGGING = {
'version':1,
'disable_existing_loggers':False,
'handlers':{
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers':{
'django.db.backends':{
'handlers':['console'],
'propagate':True,
'level':'DEBUG'
},
}
}
1.實例的背景說明
假定一個人有多本書籍,多個人可能擁有同名的一本書籍,每本書籍對應一個出版社,一個出版社對應多本書
class Publish(models.Model):
name = models.CharField(verbose_name="出版社", max_length=20)
class Meta:
db_table = "PUBLISH"
def __str__(self):
return self.name
class Book(models.Model):
book_name = models.CharField(verbose_name="書名", max_length=20)
publish = models.ForeignKey(Publish, verbose_name="出版社", on_delete=models.CASCADE)
class Meta:
db_table = "BOOK"
def __str__(self):
return self.book_name
class Person(models.Model):
first_name = models.CharField(max_length=10)
last_name = models.CharField(max_length=10)
book = models.ManyToManyField(Book, verbose_name="擁有書籍")
class Meta:
db_table = "PERSON"
def __str__(self):
return self.first_name + self.last_name
爲了簡化,我們只添加兩個出版社,每個出版社有兩本書
人民日報出版社: 鋼鐵是怎樣煉成的,西遊記
北京大學出版社:巴黎聖母院,水滸傳