Django Filtros: sugerir mejoras a la lógica de filtrado dinámico

votos
0

Estoy realizando la filtración en mi conjunto de datos basado en muchos tipos de criterios de búsqueda seleccionados por los usuarios en el frontend. Aquí hay algunas consideraciones:

  • Todos los criterios de filtro no son obligatorias. El usuario puede seleccionar / introducir valores o dejarlo en blanco. El motor tiene que encontrar una manera de comprobar los valores NULL.
  • Menús desplegables son de selección múltiple por lo que los datos del formulario de filtro podrían tener múltiples listas de los identificadores. (un montón de consultas IN)
  • Hay FECHA (de / a) campos relacionados, así que se puede dejar en blanco. Por lo que el código tiene que manejar los siguientes escenarios: la filtración intervalo de fechas | Fecha> DDMMYYYY | Fecha <DDMMAAAA.

Así es como se ve la forma: mi

Este es mi enfoque actual:

class BookingExportFilterBackend(generic_filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        predicate = request.data

        if all(dt in predicate for dt in ('from_date', 'to_date')):
            queryset = queryset.filter(date__range=(predicate['from_date'], predicate['to_date']))

        if 'from_date' in predicate and 'to_date' not in predicate:
            queryset = queryset.filter(date__gte=predicate['from_date'])

        if 'to_date' in predicate and 'from_date' not in predicate:
            queryset = queryset.filter(date__lte=predicate['to_date'])

        if 'state' in predicate:
            queryset = queryset.filter(state__in=predicate['state'])

        if 'clients' in predicate:
            queryset = queryset.filter(client__in=predicate['clients'])

        if 'camera_operators' in predicate:
            queryset = queryset.filter(camera_operator__uuid__in=predicate['camera_operators'])

        return queryset

Siento que se puede mejorar, especialmente la parte de fecha. Estoy usando la Qbiblioteca, así, pero estoy bastante nuevo en Django. (PS: He venido desde el fondo de Java / primavera / Hibernate).

Por favor, ayudar a mejorar el código.

Publicado el 20/10/2018 a las 10:25
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Usted debe tratar el django-filtros lib para el filtrado. Es muy fácil de usar y ofrece una gama de opciones de filtrado.

Para su caso, usted podría comenzar con algo como lo siguiente: Nota: no tome como referencia la fecha como un nombre de campo / variables, he sustituido con booking_date en el siguiente ejemplo.

class BookingFilter(django_filters.FilterSet):
    from_date = django_filters.NumberFilter(field_name='booking_date', lookup_expr='gt')
    to_date = django_filters.NumberFilter(field_name='booking_date', lookup_expr='lt')

    status = django_filters.CharFilter(name="status", lookup_type="contains"

    class Meta:
        model = Booking # replace with your appropriate Model
Respondida el 24/10/2018 a las 02:28
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more