Запрос моделей на основе временного диапазона в 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

            
Вернуться на верх