Django-filter: FilterSetは、認識されないフィールドタイプImageFieldへの「正確な」ルックアップでフィールド「image」を解決しました。

作成日 2017年07月24日  ·  11コメント  ·  ソース: carltongibson/django-filter

やあ!
この問題はすでにここで解決されていることは知っていますが、適切な解決策を見つけることができません。

さまざまなストアに関するさまざまな情報を含み、クエリ時に表示するimage=models.ImageFieldのフィールドも含むStoreクラスのモデルがあります。

私はドキュメントからすべてを試しましたが、それは私の除外と私がフィルタリングしているフィールドも無視しているようです

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

これは私がフィルタリングしようとしているものであり、それは私にそのAssertionErrorを投げ続けます、私が何を見逃しているかもしれないという考えはありますか? 私がmodels.pyの画像行にコメントするとすぐに機能します(ただし、フィルタリング対象の名前と作成されたものだけでなく、すべてのフィールドが表示されます。ポインタをいただければ幸いです。

よろしくお願いします

最も参考になるコメント

こんにちは@msbt-私はいくつかの情報がここに省略されていることを賭けたいと思います。 簡単なテストを実行しましたが、言及されたAssertionErrorは発生しませんでした。 以下に示すように、画像フィールドのフィルターは作成されていません。

`` `python

モデル

django.dbインポートモデルから

クラスStore(models.Model):
名前=models.CharField(max_length = 80)
作成済み=models.DateField()
image = models.ImageField()

フィルタ

django_filtersをインポートします

クラスStoreFilter(django_filters.FilterSet):
クラスメタ:
モデル=ストア
除外=['画像']
フィールド={
'name':['exact'、'contains']、
'作成済み':['正確'、'year__gt']、
}

コンソール出力

[8]の場合:StoreFilter.base_filters
Out [8]:
OrderedDict([('name'、)、
('name__contains'、)、
('作成した'、)、
('created__year__gt'、)])
`` ``

完全なモデルとフィルターコードを提供していただけますか? そうでない場合は、問題を示す蒸留された例が役立ちます。

全てのコメント11件

こんにちは@msbt-私はいくつかの情報がここに省略されていることを賭けたいと思います。 簡単なテストを実行しましたが、言及されたAssertionErrorは発生しませんでした。 以下に示すように、画像フィールドのフィルターは作成されていません。

`` `python

モデル

django.dbインポートモデルから

クラスStore(models.Model):
名前=models.CharField(max_length = 80)
作成済み=models.DateField()
image = models.ImageField()

フィルタ

django_filtersをインポートします

クラスStoreFilter(django_filters.FilterSet):
クラスメタ:
モデル=ストア
除外=['画像']
フィールド={
'name':['exact'、'contains']、
'作成済み':['正確'、'year__gt']、
}

コンソール出力

[8]の場合:StoreFilter.base_filters
Out [8]:
OrderedDict([('name'、)、
('name__contains'、)、
('作成した'、)、
('created__year__gt'、)])
`` ``

完全なモデルとフィルターコードを提供していただけますか? そうでない場合は、問題を示す蒸留された例が役立ちます。

ねえ、私に戻ってきてくれてありがとう! 私が間違ったことをしたかもしれないことを理解するためにもう少し時間を与えてください、それが新人の間違いだったら恥ずかしいでしょう;)

こんにちは@msbt-何が起こっているのか理解したことがありますか、それともこれを閉じることができますか?

今は時間がないので、閉じて、もう一度やり直して行き詰まったら、もう一度見てみましょう;)

@msbtこの問題について何か考えはありますか? 私は同じものを持っています

@georgezouqは恐れず、さまざまな理由でプロジェクトをあきらめ、解決策を見つけられませんでした

トレースバックしてください。 😀

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よろしくお願いします

汎用ビューを使用していたため、オーバーライドを無視していました。 これは一時的に私の問題を解決しましたが、私のクライアントは彼のフィルターの特異性で私を悩ませています笑。 これを調べていただけませんか

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

fields、exclude、filter_overrides in Metaは、このAssertionErrorエラーを解決しません。$ FilterView + filter_class = MyFilterSetを使用する場合、フィールドを除外するために、ビューの下でfilter_fieldsを設定する必要があります。
それ以外の場合、 def filter_for_field(cls, f, name, lookup_expr='exact')はすべてのフィールドを実行します

このページは役に立ちましたか?
0 / 5 - 0 評価