Django-filter: FilterSet resolveu o campo 'image' com pesquisa 'exata' para um tipo de campo não reconhecido ImageField...

Criado em 24 jul. 2017  ·  11Comentários  ·  Fonte: carltongibson/django-filter

Olá!
Eu sei que esse problema já foi abordado aqui , mas não consigo encontrar uma solução adequada.

Eu tenho um modelo com uma classe Store que contém várias informações sobre diferentes lojas e inclui também um campo com image = models.ImageField para exibir ao consultá-lo.

Eu tentei tudo nos documentos, mas parece estar ignorando meu exlude e também os campos pelos quais estou filtrando

class StoreFilter(django_filters.FilterSet):
    class Meta:
        model = Store
        exclude = ['image']
        fields = {
            'name': ['exact', 'contains'],
            'created': ['exact', 'year__gt'],
        }

É para isso que estou tentando filtrar e continua me lançando aquele AssertionError, alguma ideia do que posso estar perdendo? Assim que eu comento a linha da imagem no meu models.py ela funciona (mas mostra todos os campos, não apenas o nome e a criação para a qual eu estava filtrando. Qualquer ponteiro seria apreciado.

Atenciosamente

Comentários muito úteis

Oi @msbt - Aposto que algumas informações foram deixadas de fora aqui. Fiz um teste rápido e o AssertionError mencionado não foi levantado. Como você pode ver abaixo, nenhum filtro para os campos da imagem foi criado.

``` python

modelos

de modelos de importação django.db

class Store(models.Model):
nome = models.CharField(max_length=80)
criado = models.DateField()
imagem = modelos.ImageField()

filtros

importar django_filters

class StoreFilter(django_filters.FilterSet):
classe Meta:
modelo = Loja
excluir = ['imagem']
campos = {
'nome': ['exato', 'contém'],
'criado': ['exato', 'ano__gt'],
}

saída do console

Em [8]: StoreFilter.base_filters
Fora[8]:
OrderedDict([('nome',),
('nome__contém',),
('criado',),
('criado__ano__gt',)])
````

Você poderia fornecer o modelo completo e o código do filtro? Caso contrário, um exemplo destilado que demonstre o problema seria útil.

Todos 11 comentários

Oi @msbt - Aposto que algumas informações foram deixadas de fora aqui. Fiz um teste rápido e o AssertionError mencionado não foi levantado. Como você pode ver abaixo, nenhum filtro para os campos da imagem foi criado.

``` python

modelos

de modelos de importação django.db

class Store(models.Model):
nome = models.CharField(max_length=80)
criado = models.DateField()
imagem = modelos.ImageField()

filtros

importar django_filters

class StoreFilter(django_filters.FilterSet):
classe Meta:
modelo = Loja
excluir = ['imagem']
campos = {
'nome': ['exato', 'contém'],
'criado': ['exato', 'ano__gt'],
}

saída do console

Em [8]: StoreFilter.base_filters
Fora[8]:
OrderedDict([('nome',),
('nome__contém',),
('criado',),
('criado__ano__gt',)])
````

Você poderia fornecer o modelo completo e o código do filtro? Caso contrário, um exemplo destilado que demonstre o problema seria útil.

Oi, obrigado por me retornar! Dê-me um pouco mais de tempo para descobrir o que posso ter feito de errado, seria embaraçoso se fosse um erro de novato;)

Oi @msbt - você já descobriu o que estava acontecendo, ou isso pode ser fechado?

Eu não tenho tempo agora, então vamos fechar e revisitar quando eu estiver tentando novamente e ficar preso;)

@msbt Alguma idéia sobre esse problema? Eu tenho o mesmo

@georgezouq com medo de não, desistiu do projeto por diferentes motivos e nunca encontrou uma solução

Retorno por favor. 😀

Internal Server Error: /stadiums/
Traceback (most recent call last):
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 77, in get
    filterset_class = self.get_filterset_class()
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 35, in get_filterset_class
    return filterset_factory(model=self.model, fields=self.filterset_fields)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 459, in filterset_factory
    (FilterSet,), {'Meta': meta})
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 71, in __new__
    new_class.base_filters = new_class.get_filters()
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 345, in get_filters
    filters[filter_name] = cls.filter_for_field(field, field_name, lookup_expr)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 377, in filter_for_field
    ) % (cls.__name__, field_name, lookup_expr, field.__class__.__name__)
AssertionError: StadiumFilterSet resolved field 'graphic' with 'exact' lookup to an unrecognized field type FileField. Try adding an override to 'Meta.filter_overrides'. See: https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides
[13/Dec/2018 08:23:58] "GET /stadiums/?page=1 HTTP/1.1" 500 108150
class StadiumFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='iexact')

    class Meta:
        model = Stadium
        exclude = ['graphic']
        filter_overrides = {
            models.FileField: {
                'filter_class': django_filters,
                'extra': lambda f: {
                    'lookup_expr': 'icontains',
                },
            },
        }

@carltongibson pode dar uma olhada

ele estava ignorando minhas substituições, pois eu estava usando uma visão genérica. isso resolveu meu problema temporariamente, mas meu cliente está me incomodando na especificidade de seus filtros lol. Você poderia olhar para isso

urlpatterns = [
    path('', views.StadiumFilterView.as_view(model=Stadium,
                                             filterset_fields=['name', 'country']), name="stadium_index"),
]

fields, exclude, filter_overrides no Meta não resolve esse erro AssertionError , quando eu uso FilterView + filter_class = MyFilterSet , eu tenho que definir filter_fields sob vista para excluir campos,
caso contrário def filter_for_field(cls, f, name, lookup_expr='exact') passará por todos os campos

Esta página foi útil?
0 / 5 - 0 avaliações