Estaba usando CSVWidget con un CharFilter en los días anteriores a 1.x, pero estoy actualizando y esa combinación ya no funciona. No encuentro documentos ni recomendaciones sobre a qué cambiar. Quiero aceptar un solo valor o varios valores separados por comas
Prueba algo como:
class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
pass
Pasé algún tiempo encontrándome con este problema, y creo que la solución de
Estaba intentando hacer algo como:
class TestListFilter(Filter):
field_class = forms.CharField
def filter(self, qs, value):
actual_filter = fields.Lookup(value, 'in')
from pprint import pprint
pprint(value)
pprint(actual_filter)
return qs
class BaseModelFilter(filters.FilterSet):
id__in = TestListFilter(name='id', lookup_expr='in', widget=widgets.CSVWidget)
Usando DRF y una URL de: ?id__in=a,b,c
Sin embargo, parece que usar widget=widgets.CSVWidget
realidad arroja la lista como una cadena de alguna manera.
La impresión del valor del filtro da como resultado "['a', 'b', 'c']"
el actual_filter también tiene las comillas
Lookup(value="['a', 'b', 'c']", lookup_type='in')
Según la recomendación proporcionada, cambio las cosas a:
class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter):
pass
class BaseModelFilter(filters.FilterSet):
id = UUIDInFilter(name='id', lookup_expr='in')
Y luego pude usar ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246
para obtener los resultados esperados.
La cosa "Lista como cadena" parece un error o al menos algunos cambios en el documento, ¿tal vez? Sin embargo, no estoy familiarizado con cómo funciona la funcionalidad subyacente. Tal vez solo use error =)
CSVWidget
devuelve correctamente una lista de valores, sin embargo CharField.clean()
está forzando la lista de nuevo a un valor de texto, por lo tanto "['1', '2', '3']"
. No es suficiente pasar CSVWidget
al filtro; el campo del formulario debe anularse para aceptar una lista de valores.
La forma más fácil de obtener el comportamiento correcto del campo es mezclar BaseCSVFilter
, ya que construye correctamente un campo de formulario que acepta una lista de valores.
Comentario más útil
CSVWidget
devuelve correctamente una lista de valores, sin embargoCharField.clean()
está forzando la lista de nuevo a un valor de texto, por lo tanto"['1', '2', '3']"
. No es suficiente pasarCSVWidget
al filtro; el campo del formulario debe anularse para aceptar una lista de valores.La forma más fácil de obtener el comportamiento correcto del campo es mezclar
BaseCSVFilter
, ya que construye correctamente un campo de formulario que acepta una lista de valores.