Django-filter: モデルから継承されたメソッドとブールフィルターを使用したdjango_filters.BooleanFilterは、同じようには機能しません。

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

django_filters.BooleanFilterによって作成されたブールフィルターが、モデルから継承されたブールフィルターで異なるクエリパラメーターを予期するという問題が発生しました。
モデルから継承されたブールフィルターは、パラメーターがtrueまたはfalseであると想定し、BooleanFilterによって作成されたフィルターは、パラメーターが次のいずれかであると想定します。
1-「未設定」に翻訳
2-「True」に翻訳
3-「False」に翻訳
この動作により、JavaScript側からRESTAPIカスタムフィルターを処理する方法が不明確になります。

コード例:

models.py:
class TestModel(models.Model): first = models.BooleanField() last = models.BooleanField()
api.py

`インポートdjango_filters
rest_frameworkからビューセット、シリアライザーをインポートします
from .models import TestModel

クラスTestFilter(django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter(method = 'first_and_last_filter')
def first_and_last_filter(self、queryset、name、value):
value == Trueの場合:
queryset.filter(first = True、last = True);を返します。
クエリセットを返します。
クラスメタ:
モデル= TestModel
fields = ['first'、 'last'、 'first_and_last']

クラスTestSerializer(serializers.ModelSerializer):
クラスメタ:
モデル= TestModel
fields = ['first'、 'last']

クラスTestViewSet(viewsets.ModelViewSet):
モデル= TestModel
queryset = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends =(django_filters.rest_framework.DjangoFilterBackend、)
filter_fields =( 'first'、 'last'、 'first_and_last'、)
filter_class = TestFilter`

ここでのテストビューセットフィルターは、クエリパラメーターが「first」および「last」フィールドでは「true」または「false」であると想定していますが、「first_and_last」フィルターフィールドでは1、2、または3であると想定しています。
たとえば、クエリコールドのフィルタリングは次のようになります。
/ api / test /?first = true&first_and_last = 2

これは、私が遭遇した実際のプロジェクトの単純化された例であり、カスタムフィルターにはより複雑なロジックが含まれています。
問題を再現するために必要なすべてのコードを使用してリポジトリを設定しました。
https://github.com/inakrin/boolfilter

最も参考になるコメント

こんにちは@inakrin。 rest_frameworkサブパッケージからfiltersをインポートする必要があります。

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

全てのコメント3件

こんにちは@inakrin。 rest_frameworkサブパッケージからfiltersをインポートする必要があります。

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

したがって、DRFのドキュメントでは、フィルターからのインポートを提案しているため、おそらく言及する必要があります。
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
もちろん、BooleanFilterを除くすべての場合に機能します。

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