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