A. *_*unn 6 django django-models
我将来自多个传感器的时间序列数据存储在 MySQL 数据库中。每个传感器与一个设备关联,每个设备可以有多个传感器。
传感器每 10 秒轮询一次,因此在很长一段时间内(日/周/月/年),获取不必要的大型数据集会出现问题。
我想在评估之前重新采样 QuerySet,以便它只获取每第 n 行。这可能吗?
如果没有,我可以采取更明智的方法吗?我想我可以找出一个匹配时间戳微秒可能值的 1/n 的 where 子句?
device_name = request.GET['device']
device = Datalogger.objects.get(device_name=device_name)
sensors = Sensor.objects.filter(datalogger=device).order_by('pk').select_related('type')
sensor_models = sensors.values_list('type', flat=True) # get all models of sensor used by this controller
sensor_datum_types = list(SensorModelDatumType.objects.filter(sensor__in=sensor_models).order_by('sensor',
'datum_type')) # get all datatypes relating to all models of sensor used
# assign each trace (sensor/datum_type combination) an indice for the tuples (zero is used for time/x-axis)
bulk_queryset = SensorDatum.objects.filter(sensor__datalogger__device_name=device_name,
timestamp__gte=get_filter_start_time(request),
timestamp__lte=get_filter_end_time(request))
chart_traces = []
chart_trace_indices = {}
chart_trace_data = [None]
chart_trace_queryset = SensorDatum.objects.none()
next_free_idx = 1
for sensor in sensors:
for datum_type in sensor_datum_types:
if datum_type.sensor == sensor.type:
chart_trace_name = get_chart_trace_name(sensor.sensor_name, datum_type.datum_type.description)
chart_traces.append({'sensor': sensor.sensor_name, 'datum_type': datum_type.datum_type.description,
'chart_trace_name': chart_trace_name})
chart_trace_indices.update({chart_trace_name: next_free_idx})
chart_trace_queryset = chart_trace_queryset | bulk_queryset.filter(sensor_id=sensor.id,
type_id=datum_type.datum_type.id)
next_free_idx += 1
# process data into timestamp-grouped tuples accessible by chart_trace_index ([0] is timestamp)
raw_data = list(chart_trace_queryset.order_by('timestamp', 'sensor_id', 'type_id'))
row_count = len(raw_data)
Run Code Online (Sandbox Code Playgroud)
您也许可以使用.annotate()和 模数来仅检索每 N 行。 我用这个答案作为我的参考。
Foo.objects.annotate(idmod4=F('id') % 4).filter(idmod4=0)
Run Code Online (Sandbox Code Playgroud)
这应该大约每 4 行返回一次,但如果您还使用其他一些过滤器,那么您可能无法获得精确的子样本,过滤器可能会排除一堆适合模数的行,因此您不幸的是,扫描仪您的过滤没有那么多 4 的倍数的 id。尽管您提到您正在生成很多行,但对于子样本来说这可能就足够了。
| 归档时间: |
|
| 查看次数: |
1126 次 |
| 最近记录: |