Saya mengalami masalah bahwa filter boolean yang dibuat oleh Django_filters.BooleanFilter mengharapkan parameter kueri yang berbeda dengan filter boolean yang diwarisi dari model.
Filter Boolean yang diwarisi dari model mengharapkan param benar atau salah, filter yang dibuat oleh BooleanFilter mengharapkan param menjadi:
1 - diterjemahkan menjadi "tidak disetel"
2 - diterjemahkan menjadi "Benar"
3 - diterjemahkan menjadi "Salah"
Perilaku ini membuat tidak jelas bagaimana memproses rest api custom filter dari sisi javascript.
Contoh kode:
model.py:
class TestModel(models.Model):
first = models.BooleanField()
last = models.BooleanField()
api.py
`impor django_filters
dari rest_framework mengimpor viewset, serializers
dari .models impor TestModel
kelas 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):
jika nilai==Benar:
kembali queryset.filter(pertama=Benar, terakhir=Benar);
kembali set kueri;
kelas Meta:
model = TestModel
bidang = ['pertama', 'terakhir', 'pertama_dan_terakhir']
kelas TestSerializer(serializers.ModelSerializer):
kelas Meta:
model = TestModel
bidang = ['pertama', 'terakhir']
kelas TestViewSet(viewsets.ModelViewSet):
model = TestModel
queryset = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends = (Django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('pertama', 'terakhir', 'pertama_dan_terakhir', )
filter_class = TestFilter`
Filter viewset pengujian di sini mengharapkan parameter kueri menjadi "benar" atau "salah" untuk bidang "pertama" dan "terakhir", tetapi mengharapkannya menjadi 1,2 atau 3 untuk bidang filter "pertama_dan_terakhir".
Misalnya memfilter kueri dingin menjadi seperti ini:
/api/test/?first=true&first_and_last=2
Ini adalah contoh yang disederhanakan dalam proyek nyata yang saya temui, filter khusus berisi logika yang lebih rumit.
Saya telah menyiapkan repo dengan semua kode yang diperlukan untuk mereproduksi masalah.
https://github.com/inakrin/boolfilter
Halo @inakrin. Anda harus mengimpor filters
dari sub-paket rest_framework
.
https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py
Jadi mungkin harus disebutkan dalam dokumentasi DRF karena mereka menyarankan untuk mengimpor dari filter:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
Dan tentu saja berfungsi dalam semua kasus kecuali BooleanFilter.
Komentar yang paling membantu
Halo @inakrin. Anda harus mengimpor
filters
dari sub-paketrest_framework
.https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py