我正在编写一个Django视图,用于查询数据库中的对象列表以及相关字段中的一些信息。问题是数据库正在对7个对象进行10次查询。这是代码:
模板代码:
class ResourceList(generic.ListView):
model = Submissions
context_object_name = 'results'
template_name = 'url_list.html'
查看代码:
class Submissions(models.Model):
LEVEL = (
('Introductory', 'Introductory'),
('Intermediate', 'Intermediate'),
('Academic', 'Academic'),
)
MEDIA_TYPE = (
('HTML', 'HTML'),
('PDF', 'PDF'),
('Video', 'Video'),
('Other', 'Other'),
)
id = models.AutoField(primary_key=True)
url = models.URLField(unique=True)
tags = models.ForeignKey(MajorTags, default=0)
level = models.CharField(choices=LEVEL, max_length=25)
media_type = models.CharField(choices=MEDIA_TYPE, max_length=25)
def __unicode__(self):
return self.url
def __str__(self):
return self.url
class Stats(models.Model):
url = models.ForeignKey(Submissions)
id = models.AutoField(primary_key=True)
avg = models.FloatField(default=0)
std_dev = models.FloatField(default=0)
def __unicode__(self):
return self.url.url + " " + str(self.avg)
def __str__(self):
return self.url.url + " " + str(self.avg)
必要的模型:
{{resource.stats_set.values.0.avg}}
问题的根源是queryset = Submissions.objects.all().select_related('avg')
位。问题是,如果我尝试select_related()
,我会收到一条错误消息,指出tags
的唯一选项是Submissions
这是有道理的,因为这是Stats
中的唯一字段具有外键的模型。此时我的数据库结构已经很好地锁定了,所以我无法更改数据库。我还无法查询react-native-cli
并从那里开始反向,因为我需要获取尚未包含统计信息的数据。
如何减少我正在运行的SQL查询的数量?
答案 0 :(得分:2)
您应该使用prefetch_related
来进行有关反向外键或多对多关系的有效查询:
来自文档:
<强> prefetch_related()强>
返回一个将自动检索的QuerySet 批处理,每个指定查找的相关对象。
def get_queryset(self,*args,**kwargs):
return Submissions.objects.all().prefetch_related('stats_set')
这需要一个额外的查询,但想法是它会立即获取所有相关信息,而不是每Submissions
个对象获取一次。
另外,建议使用名词的单数作为模型类名:Submission
而不是Submissions
。