Django __str__减少了SQL查询

时间:2016-04-13 20:11:54

标签: python sql django database-performance

我的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})

我有一个重要问题:

查询SELECT•••FROM“book_bookserie”WHERE“book_bookserie”。“id”='1'执行5次(django调试工具栏给出此代码行返回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次

1 个答案:

答案 0 :(得分:1)

BookVolume __str__ self.serie.title访问BookSerie。每次都会访问数据库,因为必须检索相应的BookVolume记录。在此处减少查询的一种方法是在查询# 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
select_related

来自文档: {{1}} ...

  

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