Skip to main content
 首页 » 编程设计

python之按日期时间过滤的 Django 休息框架

2024年08月19日30qq号

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

模型.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 代码。

谢谢!!!! :)

请您参考如下方法:

您可以简单地使用 lt, lte, gt, gte 到您要过滤的字段, 像这样: 类 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 设置中指定全局过滤器后端,请尝试将其添加到您的 View 中

filter_backends = (django_filters.rest_framework.DjangoFilterBackend, )