在Django REST框架中查询基于时间范围的模型



我有一个数据库,每个模型都有两个时间戳。

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

允许我通过IDGET www.website.com/timestamp/42返回obj。

我希望这个查询需要一个新的视图集。我知道如何添加一个ViewSet嵌套的url路径,但不应该有一种方式发送请求到/timespan包含"开始"one_answers";以何种;参数改变返回什么?

你可以做很多转换但我想最简单的方法是这样的:

...    
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

您可以通过以下方式自定义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()

最新更新