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
したがって、DRFのドキュメントでは、フィルターからのインポートを提案しているため、おそらく言及する必要があります。
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
もちろん、BooleanFilterを除くすべての場合に機能します。
最も参考になるコメント
こんにちは@inakrin。
rest_framework
サブパッケージからfilters
をインポートする必要があります。https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py