Django:如何在大型表上优化此查询

时间:2011-08-20 00:44:39

标签: django django-orm

为了给出背景信息,我在不同的站点进行了大量的温度测量,我想检查它是否与预测的一致。 我的模特是:

class Station(models.Model):
    station_id = models.CharField(max_length =  18 ,primary_key = True)
    sector = models.CharField(max_length = 40)

class Weather(models.Model):
    station = models.ForeignKey(Station)
    temperature = models.FloatField()
    date = models.DateField()   

class Forecast(models.Model):
    station = models.ForeignKey(Station)
    date = models.DateField()   
    score = models.IntegerField()

对于每次温度测量,我想知道过去7天中该站的预测分数的平均值,除非在此时间范围内有另一个温度测量值,在这种情况下它是起点。以下代码执行我想要的但是执行速度太慢(~10分钟!):

observations = Weather.objects.all().order_by('station','date')
for obs in observations:
    try :
        if obs.station == previous.station:
            date_inf = min(obs.date- timedelta(days=7), previous.date)
        else :
            date_inf = obs.date- timedelta(days=7)
    except UnboundLocalError :
        date_inf = obs.date- timedelta(days=7)      

    forecast = Forecast.objects.filter(
                                      station=obs.station
                             ).filter(
                                      date__gte = date_inf
                             ).filter(
                                      date__lte =  obs.date - timedelta(days=1)
                             ).aggregate(average_score=Avg('score'))


    if forecast["average_score"] is not None:
        print(forecast["average_score"],obs.rating)
        # Some more code....

    previous = obs

如何优化执行时间?有没有办法用一个查询来做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

对于每次测量,您都会重新计算过去7天的平均值。如果您的测量结果比7天更接近,则会有重叠。例如。如果您的测量间隔为1天,则在数据库中重新计算每个对象的平均值6次。

您最好的选择是获取所有测量值,然后是所有匹配的预测值,然后在Python中对内存进行平均。当然,更多的python代码,但它会运行得更快。