markdown django休息框架过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown django休息框架过滤器相关的知识,希望对你有一定的参考价值。

# Introducción

En este snippet pretendemos hacer varios filtros diferentes
para una aplicación django que usa django rest framework (DRF).

No se cubre la instalación, configuración y puesta en marcha
de django filters. Aquí tienes varios enlaces con información
relevante:

[Filtrado DRF](http://www.django-rest-framework.org/api-guide/filtering/)
[Integración DRF](https://django-filter.readthedocs.io/en/master/guide/rest_framework.html)
[django filter github](https://github.com/carltongibson/django-filter)

**IMPORTANTE:** Los filtros necesitan de un serializer + viewset que creamos con DRF.


## Filtrado común

Este es el ejemplo más común. Con agregar unos pocos parámetros tenemos hecho el filtrado.
[Documentación oficial](http://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend).

``` python
class ProductList(generics.ListAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = Access.objects.all()
    serializer_class = AccessSerializer
    filter_fields = ('category', 'in_stock')
```

En el ejemplo, agregamos un permiso para exigir login al usar la API. Además:

- Con el `query_set` obtenemos los datos que se van a mostrar, en el ejemplo, todos.

- Por su lado, `serializer_class` hace referencia al serializer encargado de determinar que campos se podrán consultar.

- Por último, lo que nos interesa en este ejemplo, el `filter_fields`
que se emplea para realizar el filtrado de campos, por ejemplo, con un string
indicando la categoria por la que filtrar los resultados.

## Filtrado date o datetime

¿Qué pasa si queremos filtrar por fechas?
Es bastante improbable que queramos una fecha y horas específicias,
menos aún el el formato que nos muestra django, algo como esto:
`2018-04-02T16:09:09.949331Z`. Lo lógico sería filtrar si **contiene**
la fecha o está en un rango **mayor** o **menor** a una fecha dada.


### Contiene la fecha

Ideal para devolver los resultados de, por ejemplo, un día concreto.
En el ejemplo usaremos un campo datetime en el modelo pero filtraremos
por un date para obtener el día.

```python
class ProductListDayDateFilter(filters.FilterSet):
    # Hacemos filtrado por fecha
    last_update_contains = django_filters.DateFilter(name="last_update", lookup_expr='contains')
    class Meta:
        model = ProductList
        # Especificamos el nombre del campo filtro
        fields = ['last_update_contains']


class ProductListViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = ProductList.objects.all()
    serializer_class = ProductListSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    # Especificamos el filtro que se va a emplear
    filter_class = ProductListDayDateFilter
```

### Rango mayor o menor

Ideal para devolver los resultados de, por ejemplo, una semana.
Dependiendo de como lo usemos también vale para consultar el día
pero es mucho menos intuitivo que la opción de [Contiene la fecha](#contiene-la-fecha).

```python
class ProductListDateLteGteFilter(filters.FilterSet):
    # Filtra por las fechas inferiores a la introducida
    last_update_lte = django_filters.DateTimeFilter(name="last_update", lookup_expr='lte')
    # Filtra por las fechas mayores a la introducida
    last_update_gte = django_filters.DateTimeFilter(name="last_update", lookup_expr='gte')
    class Meta:
        model = ProductListnswer
        # Especificamos el nombre de los campos filtro
        fields = ['last_update_gte', 'last_update_lte']


class ProductListViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = ProductList.objects.all()
    serializer_class = ProductListSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    # Especificamos el filtro que se va a emplear
    filter_class = ProductListDateLteGteFilter
```

以上是关于markdown django休息框架过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Django 休息框架问题

Django 休息框架。更新嵌套对象

Django 测试休息框架:APIRequestFactory vs APIClient

oTree 中的 Django 休息框架

无法登录 Angular2 / Django 休息框架

Django - 带有休息框架的数据表ajax错误