0

如果您的模型结构如下:

class Hour(models.Model):
    stat1 = models.FloatField()
    stat2 = models.FloatField()
    stat3 = models.FloatField()

class Day(models):
    hour = models.ForeignKey(Hour) #e.g.: Hour.id=1, Hour.id=2, ..., Hour.id=24

class Weather(models.Model):
    day = models.ForeignKey(Day)

注意:hours可能会从某些中丢失,days并且stats可能会从某些中丢失hours。数据收集缺少每天的所有时间和每小时的所有统计数据。

在这个层次结构上求和和平均统计数据的最佳方法是models什么?例如,假设当我知道有些日子没有数据时,我想要所有有数据的stat2at的总和和平均值?H5daysWeatherH5

更新:我自己的解决方案,假设 Day.id 等于一天中的小时:例如,如果 Day.id == 5,那么它是当天的 H5:

hours = [[hour for hour in w.day.objects.all() if hour.id==5] \
    for w in Weather.objects.all()]
var2_sum = [sum(h.var2 for h in hours if hasattr(h,'var2'))]
var2_count = [count(h.var2 for h in hours if hasattr(h,'var2'))]
var2_avg = var2_sum / var2_count
4

1 回答 1

0

更新:我自己的解决方案,假设 Day.id 等于一天中的小时:例如,如果 Day.id == 5,那么它是当天的 H5:

hours = [[hour for hour in w.day.objects.all() if hour.id==5] \
    for w in Weather.objects.all()]
var2_sum = [sum(h.var2 for h in hours if hasattr(h,'var2'))]
var2_count = [count(h.var2 for h in hours if hasattr(h,'var2'))]
var2_avg = var2_sum / var2_count

Nested forloops are fun and all, but are a brute force way to answer the question. The use of hasattr is necessary to avoid have None entries into the lists created by list comprehension.

于 2013-02-07T14:01:58.443 回答