【问题标题】:Django __str__ reduce SQL queriesDjango __str__ 减少 SQL 查询
【发布时间】:2016-04-13 20:11:53
【问题描述】:

我的 Django 项目中有两个模型

class BookSerie(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255)

class BookVolume(models.Model):
    isbn = models.CharField(max_length=17)
    volumeNumber = models.PositiveIntegerField()
    serie = models.ForeignKey(BookSerie)

    def __str__(self):
        return self.serie.title+" volume "+str(self.volumeNumber)+" - "+str(self.isbn)

我只将 __ str __ 用于我的管理面板,但是当我在视图中使用此代码时(id=1 的系列有 5 卷):

def serieDetails(request, title):
    try:
        seriequery = BookSerie.objects.get(slug=title)
        BookVolume.objects.filter(serie=seriequery).order_by('volumeNumber')
    except BookSerie.DoesNotExist:
        raise Http404("Serie does not exist")

    return render(request, 'book/serieDetails.html', {'serie': seriequery, 'volumes' : volumesquery})

我有一个重要的问题:

Query SELECT ••• FROM "book_bookserie" WHERE "book_bookserie"."id" = '1' 执行 5 次(django 调试工具栏给出此代码行 return self.serie.title+" volume "+str (self.volumeNumber)+" - "+str(self.isbn)

查询 SELECT ••• FROM "book_bookvolume" WHERE "book_bookvolume"."serie_id" = '1' ORDER BY "book_bookvolume"."volumeNumber" ASC 执行2次

【问题讨论】:

    标签: python sql django database-performance


    【解决方案1】:

    在您的BookVolume__str__ 中,您可以访问self.serie.title。这每次都会命中数据库,因为必须检索相应的 BookSerie 记录。此处减少查询的一种方法是在查询 BookVolume 时使用 select_related

    # any reason why you don't store this QuerySet to a variable?
    BookVolume.objects.filter(serie=seriequery).order_by('volumeNumber').select_related('serie')
    
    # better:
    seriequery.bookvolume_set.order_by('volumeNumber').select_related('serie')
    

    来自文档: select_related...

    ... 将“遵循”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

    【讨论】:

    • 谢谢!你用 __ str __ 解决了我的问题,但我对第二个查询仍有一些问题。
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2011-09-24
    • 2014-02-07
    相关资源
    最近更新 更多