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休息框架过滤器的主要内容,如果未能解决你的问题,请参考以下文章