لقد واجهت مشكلة تتمثل في أن عامل التصفية المنطقي الذي تم إنشاؤه بواسطة django_filters.BooleanFilter يتوقع معلمات استعلام مختلفة باستخدام عامل التصفية المنطقي الموروث من النموذج.
يتوقع المرشح المنطقي الموروث من النموذج أن تكون المعلمة صحيحة أو خاطئة ، ويتوقع المرشح الذي تم إنشاؤه بواسطة BooleanFilter أن تكون المعلمات إما:
1 - ترجم إلى "غير محدد"
2 - ترجم إلى "True"
3 - ترجم الى "False"
هذا السلوك يجعل من غير الواضح كيفية معالجة بقية عوامل التصفية المخصصة لواجهة برمجة التطبيقات من جانب جافا سكريبت.
رمز المثال:
نماذج. py:
class TestModel(models.Model):
first = models.BooleanField()
last = models.BooleanField()
api.py
`استيراد django_filters
من مجموعة عروض استيراد rest_framework والمسلسلات
من نماذج استيراد TestModel
فئة TestFilter (django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter (الطريقة = 'first_and_last_filter')
def first_and_last_filter (self، queryset، name، value):
إذا كانت القيمة == صحيح:
إرجاع الاستعلامset.filter (الأول = صواب ، والأخير = صواب) ؛
مجموعة استعلام العودة ؛
فئة ميتا:
النموذج = TestModel
الحقول = ['first'، 'last'، 'first_and_last']
فئة TestSerializer (مسلسلات.ModelSerializer):
فئة ميتا:
النموذج = TestModel
الحقول = ['الأول' ، 'الأخير']
فئة TestViewSet (viewets.ModelViewSet):
النموذج = TestModel
مجموعة الاستعلام = TestModel.objects.all ()
serializer_class = TestSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend ،)
filter_fields = ('الأول' ، 'الأخير' ، 'first_and_last' ،)
filter_class = TestFilter`
يتوقع مرشح مجموعة طرق الاختبار هنا أن تكون معلمة الاستعلام "صواب" أو "خطأ" للحقول "الأولى" و "الأخيرة" ، ولكنها تتوقع أن تكون 1 ، 2 أو 3 لحقل التصفية "الأول والأخير".
على سبيل المثال تصفية الاستعلام البارد يكون مثل هذا:
/ api / test /؟ first = true & first_and_last = 2
هذا مثال مبسط في المشروع الحقيقي الذي صادفته ، يحتوي الفلتر المخصص على منطق أكثر تعقيدًا.
لقد قمت بإعداد الريبو مع جميع الأكواد اللازمة لإعادة إنتاج المشكلة.
https://github.com/inakrin/boolfilter
مرحباinakrin. يجب استيراد filters
من الحزمة الفرعية rest_framework
.
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-filteret
وهو يعمل بالطبع في جميع الحالات باستثناء BooleanFilter.
التعليق الأكثر فائدة
مرحباinakrin. يجب استيراد
filters
من الحزمة الفرعيةrest_framework
.https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py