Запрос моделей на основе временного диапазона в Django REST Framework
У меня есть БД с моделями, каждая из которых имеет две временные метки.
class Timespan(models.Model):
name = models.CharField(null=False)
start_time = models.DateTimeField(null=False)
end_time = models.DateTimeField(null=False)
Я хочу иметь возможность запрашивать эти объекты на основе диапазона временных меток. Запрос GET также должен иметь начальное и конечное время, и все временные интервалы, которые пересекаются, будут возвращены.
Однако я не уверен, как построить GET-запрос для этого, а также представление в Django.
Должен ли GET запрос просто использовать url параметры?
GET www.website.com/timespan?start=1000&end=1050
или передать его в теле? (если это вообще имеет значение)
В настоящее время мое представление выглядит следующим образом:
class TimespanViewSet(OSKAuthMixin, ModelViewSet):
queryset = Timespan.objects.filter()
serializer_class = TimespanSerializer
Что позволяет мне вернуть obj по ID GET www.website.com/timestamp/42.
Я предполагаю, что мне понадобится новый набор представлений для этого запроса. Я знаю, как добавить ViewSet с вложенным urlpath, но разве не должно быть способа отправить запрос на /timespan включение параметра "start" и "end" изменяет то, что возвращается?
Вы можете настроить get_queryset функцию
from django.db.models import Q
class TimespanViewSet(OSKAuthMixin, ModelViewSet):
queryset = Timespan.objects.filter()
serializer_class = TimespanSerializer
def get_queryset(self):
start_timestamp = int(self.request.GET.get("start", "0"))
end_timestamp = int(self.request.GET.get("end", "0"))
if start_timestamp > 0 and start_timestamp > 0:
return Timespan.objects.filter(
Q(start_time___range = (start_timestamp, end_timestamp)) |
Q(end_time___range = (start_timestamp, end_timestamp))
)
else:
return Timespan.objects.all()
Надеюсь, это может помочь.
Вы можете сделать конвертацию многими способами, но я думаю, что самый простой способ такой:
...
from django.utils import timezone
...
class TimespanViewSet(OSKAuthMixin, ModelViewSet):
queryset = Timespan.objects.all()
serializer_class = TimespanSerializer
def get_queryset(self,*args,**kwargs):
start_time = self.request.GET.get("start_time",None)
end_time = self.request.GET.get("end_time",None)
if start_time and end_time :
# convert timestamps to timezone objects
start_time_instance = timezone.datetime.fromtimestamp(start_time)
end_time_instance = timezone.datetime.fromtimestamp(end_time)
return self.queryset.filter(start_time=start_time_instance,end_time_instance=end_time_instance)
else:
# do some handling here
return self.queryset