<p>所有的传感器、参数和传感器参数都让我头晕目眩,但我会试试看。如果要按<code>SensorParameter</code>对结果进行分组,默认方法是查询该模型:</p>
<pre><code>qs = (SensorParameter.objects
.filter(sensor=sensor, data__time__range=range_period)
.select_related('sensor', 'parameter')
.distinct()
.order_by('sensor_parameter'))
</code></pre>
<p>由于要访问按时间排序的相关<code>Data</code>对象,因此应发出相应的<code>prefetch_related</code>命令:</p>
<pre><code>from django.db.models import Prefetch
sorted_data_qs = (Data.objects
.filter(time__range=range_period)
.order_by('time'))
prefetch = Prefetch('data_set', queryset=sorted_data_qs)
qs = qs.prefetch_related(prefetch) # using qs from above
</code></pre>
<p>只需两个SQL查询,就可以在单个<code>SensorParameter</code>对象中将所有数据按<code>SensorParameter</code>分组。您可以按如下方式访问各个数据行:</p>
<pre><code>for rs in qs:
for d in rs.data_set.all():
print(rs.sensor.name, rs.parameter.name, d.value, d.time)
</code></pre>
<p>当然,在构造对象时会有一些开销;如果您不需要它们,而只需要数据行,则可以采用另一种方法:</p>
<p>获取满足筛选器要求的所有<code>SensorParameter</code>的列表,然后对所有这些<code>SensorParameter</code>运行单独的查询,获取可以按照最初设想放入列表的词典:</p>
<pre><code>sensor_params = (SensorParameter.objects
.filter(sensor=sensor, data__time__range=range_period)
.value_list('id', flat=True))
result_list = []
for sp in sensor_params:
param_results = list(
Data.objects
.filter(sensor_parameter=sp, time__range=range_period)
.order_by('time')
.values(
'sensor_parameter__sensor__name',
'sensor_parameter__parameter__name',
'value',
'time'
)
)
result_list.append(param_results)
</code></pre>
<p>这将导致更多的查询(传感器计数加1),但这并不意味着它一定比第一种方法慢(甚至可能更快)。在这里,分组是在数据库中而不是在Python中完成的。你知道吗</p>