У меня есть 3 модели: run, параметр_датчика и данные. Между ними есть и другие отношения с внешним ключом, но run не имеет прямого внешнего ключа ни к sensor_parameter, ни к данным.
Запуск имеет время начала и время окончания и связан с камерой.
class Run(models.Model):
start_time = models.DateTimeField(db_index=True)
end_time = models.DateTimeField(db_index=True)
chamber = models.ForeignKey(Chamber, on_delete=models.CASCADE)
Камера связана с датчиком, а датчик имеет набор параметров_датчика.
class SensorParameter(models.Model):
sensor = models.ForeignKey(Sensor)
parameter = models.ForeignKey(Parameter)
Наконец, точка данных "принадлежит" параметру датчика:
class Data(models.Model):
time = models.DateTimeField(db_index=True)
sensor_parameter = models.ForeignKey(SensorParameter, on_delete=models.CASCADE)
parameter_value = models.FloatField()
Мне нужно отфильтровать список sensor_parameter(s), принадлежащих запуску, но моя единственная связь между ними – это значение времени. Поскольку данные имеют отметку времени, а выполнение имеет время начала и время окончания, я подумал, что могу отфильтровать список data.sensor_parameter в диапазоне периода времени.
Я не уверен, как построить этот фильтр набора запросов.
Я импортировал дату и время и имею доступ к django_filter.
Это то, что у меня есть до сих пор в моих views.py
import datetime
import django_filters
def get(self, request):
# Get a list of run objects, that are passed through the request
run_ids = request.GET.getlist('id')
runs = Run.objects.filter(pk__in=run_ids)
# Get a list of all chambers that own those runs
chamber = Chamber.objects.filter(run__in=runs).distinct()
# Get a list of all sensors that belong to those chambers
sensor = Sensor.objects.filter(chamber=chamber)
# Looking around, I saw these two DateTimeFilter expressions from django_filters
time__gte = django_filters.DateTimeFilter(name="time", lookup_expr='gte')
time__lte = django_filters.DateTimeFilter(name="time", lookup_expr='lte')
# Here I would have to determine which run.start_time is lower
# And which run.end_time is higher, to get a valid time range
# This part is not finished yet
time_start = run.start_time
time_end = run.end_time
# This is the filter I'm having trouble implementing
sensor_parameters = SensorParameter.objects.filter(sensor=sensor, data__time__gte=time_start, data__time__lte=time_end)
return render(request, self.template_name, {'run': run, 'sensor_parameters': sensor_parameters})
По сути, я подумал, что если я извлеку start_time и end_time из своих прогонов (это может быть более одного прогона, мне нужно будет определить, какое start_time strong> меньше, а end_time больше), то я мог бы отфильтровать свой sensor_parameter по data.time, используя временной диапазон.
Я понятия не имею, как действовать дальше.
Кроме того, мы используем PostgreSQL, если это имеет значение.
Если вы видите какие-либо вопиющие ошибки или синтаксические ошибки, пожалуйста, не стесняйтесь исправлять и критиковать, я все еще новичок, и в Django, и в Python, но люблю каждую минуту этого.