Django優化---select_rlted和prefetch_relted的使用

在數據庫有外鍵的時候,使用 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

爲了簡化,我們只添加兩個出版社,每個出版社有兩本書
人民日報出版社: 鋼鐵是怎樣煉成的,西遊記
北京大學出版社:巴黎聖母院,水滸傳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章