Django rest框架按日期时间过滤

Posted

技术标签:

【中文标题】Django rest框架按日期时间过滤【英文标题】:Django rest framework filtering by dateTime 【发布时间】:2018-04-23 12:32:45 【问题描述】:

我正在尝试在 django restFramework 中按 dateTime 过滤。 好像不行,因为不过滤,总是带来一样的结果。

模型.py

#Modelo Fechas que formara parte del modelo horario
class Fecha(models.Model):
    fecha_inicio = models.DateTimeField(blank=True, default='')
    fecha_fin = models.DateTimeField(blank=True, default='')

    def __str__(self):
        return self.fecha_inicio, self.fecha_fin

#Modelo Horario
class Horario(models.Model):
    profesional = models.ForeignKey(Profesional, unique=True)
    fechas = models.ManyToManyField(Fecha)

    def __str__(self):
        return self.profesional.user.username 

查看.py

class FechaList(generics.ListAPIView):
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    serializer_class = FechaSerializer
    queryset = Fecha.objects.all()
    filter_class = HorarioFilter

网址.py

 url(r'^horario/$', views.FechaList.as_view())

过滤器.py

   class HorarioFilter(django_filters.FilterSet):
    date_start = django_filters.DateTimeFilter(name="fecha_inicio")

    class Meta:
        model = Fecha
        fields = 
            'date_start': ['lte', 'gte', 'lt', 'gt'],
        

序列化器.py

class FechaSerializer(serializers.ModelSerializer):

    class Meta:
        model = Fecha
        fields = ('fecha_inicio','fecha_fin')

请求:http://127.0.0.1:8000/horario/?date_start__gte=2015-6-28+00:00。不要做任何事情,不要过滤,但响应是“horario”对象的列表并给出 200 代码。

谢谢!!!! :)

【问题讨论】:

您可以尝试将views.py中的filter_class=HorarioFilter替换为filter_backends = (HorarioFilter,) 用你的解决方案我有这个错误:AttributeError at /horario/ 'HorarioFilter' object has no attribute 'filter_queryset' 这个问题你解决了吗?你能分享你的代码吗? 【参考方案1】:

您可以简单地将ltltegtgte 用于您要过滤的字段,如下所示: 类 HorarioFilter(django_filters.FilterSet):

    class Meta:
        model = Horario
        fields = 
            'fecha__inicio': ['lte', 'gte', 'lt', 'gt'],
        

您的 API 请求将是:GET DOMAIN/RESOURCES/?fecha__inicio__gte=2017-6-28+00:00&fecha__inicio__lt=2017-6-29+00:00:00

如果您想要查询参数的更清晰或自定义查找表达式,您可以使用创建一个别名,如 this:

class HorarioFilter(django_filters.FilterSet):

    class Meta:
        model = Horario
        fields = 
            'started__lte': ['fecha__inicio__lte'], 
            'started__gte': ['fecha__inicio__gte'],
        

那么你的 API 请求会是这样的:GET DOMAIN/RESOURCES/?started__gte=2017-6-28+00:00&started__lte=2017-6-29+00:00:00

最重要的是,假设您使用推荐的django-filter,并且您使用的是 1.x。如果您没有在 DRF 设置中指定全局过滤器后端,请尝试将其添加到您的视图中

filter_backends = (django_filters.rest_framework.DjangoFilterBackend, )

【讨论】:

但是,我要发送请求的 url 是什么?喜欢吗?:127.0.0.1:8000/horario/?fecha_inicio=2017-11-08T10:00:00 更新了我的答案,还添加了一种更简洁的查询参数 我已经用您的更改更新了我的问题,但不起作用....不要做任何事情....您能帮帮我吗?非常感谢! :)

以上是关于Django rest框架按日期时间过滤的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework 按日期过滤=无

Django 按时间过滤日期时间字段,与日期无关

Django:按日期过滤日期时间忽略时间

如何在 django 中按日期范围过滤记录?

WooCommerce REST API - 按修改日期过滤订单

Django:按日期范围过滤对象