如何优化此Django视图的SQL?

时间:2015-11-20 16:21:59

标签: python sql django query-optimization

我正在编写一个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查询的数量?

1 个答案:

答案 0 :(得分:2)

您应该使用prefetch_related来进行有关反向外键或多对多关系的有效查询:

来自文档:

  

<强> prefetch_related()

     

返回一个将自动检索的QuerySet   批处理,每个指定查找的相关对象。

def get_queryset(self,*args,**kwargs):
     return Submissions.objects.all().prefetch_related('stats_set')

这需要一个额外的查询,但想法是它会立即获取所有相关信息,而不是每Submissions个对象获取一次。

另外,建议使用名词的单数作为模型类名:Submission而不是Submissions