Django-filter: TypeError: __init __ () حصل على وسيطة غير متوقعة للكلمة الرئيسية 'name'

تم إنشاؤها على ٤ نوفمبر ٢٠١٧  ·  7تعليقات  ·  مصدر: carltongibson/django-filter

أستخدم المثال في المستند:

release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')

لكنني حصلت على الخطأ:
TypeError: __init__() got an unexpected keyword argument 'name'

عندما أبحث عن الكود ، وجدت أن "الاسم" قد تغير إلى "اسم_المجال" ، المستند قديم ، أليس كذلك؟

كما أنني أستخدم الكود:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = ['file_name', ]

أعلاه على ما يرام ، ولكن عندما أستخدم الكود:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name' : ['icontains'] }

إنه لا يعمل. لا يحتوي quey sql على بيان like %somevalue% ، لماذا؟

شكرا،
كريس

التعليق الأكثر فائدة

مرحبًا zhangqunshi ، يبدو أنك تستخدم الإصدار 2.0.0.dev1 المسبق. أنت محق ، لقد أصبح field_name name field_name . لم يتم تحديث المستندات لتعكس هذا (وهو جزء من سبب كونه إصدارًا مسبقًا).

ليس من السهل تصحيح أخطاء FileEvent بدون رؤية النموذج الفعلي. ماذا يحدث عند تنفيذ الاستعلام التالي؟

FileEvent.objects.filter(file_name__icontains='foo')

ال 7 كومينتر

مرحبًا zhangqunshi ، يبدو أنك تستخدم الإصدار 2.0.0.dev1 المسبق. أنت محق ، لقد أصبح field_name name field_name . لم يتم تحديث المستندات لتعكس هذا (وهو جزء من سبب كونه إصدارًا مسبقًا).

ليس من السهل تصحيح أخطاء FileEvent بدون رؤية النموذج الفعلي. ماذا يحدث عند تنفيذ الاستعلام التالي؟

FileEvent.objects.filter(file_name__icontains='foo')

FileEvent بسيط ، يحتوي فقط على report_id و file_name و event_time. عندما أستخدم:

FileEvent.objects.filter(file_name__icontains='foo')

ستصبح SQL:

select * from file_event where file_name like '%foo%'

بالنسبة للكود:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = ['file_name', ]

ستصبح SQL:

select * from file_event where file_name ='foo'

بالنسبة للكود:

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name' : ['icontains'] }

ستصبح SQL:

select * from file_event

راجع للشغل رمز الحصول على مجموعة الاستعلام هو:

    filter = MyFilter(request.GET,
                               queryset=FileEvent.objects.values().filter(report_id=1).order_by(
                                   '-event_time'))
   print(filter.qs)

ولا يمكنني العثور على أي مساعدة من doc ، وكيفية الحصول على نتيجة من عامل التصفية في طريقة عرض مشتركة ، لذلك أبحث عن الكود ، وأجد الحقل 'qs'in BaseFilterSet ، وهو يعمل.

الآن قمت بتغيير الرمز إلى:

class MyFilter(django_filters.FilterSet):
    file_name = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = FileEvent
        fields = ['file_name',]

وهو يعمل ، SQL هو like '%foo%'

zhangqunshi ، أعتقد أنك تقوم بالتصفية باستخدام سلسلة استعلام غير صحيحة. يجب أن يكون:

/file-events?file_name__icontains=foo

أنت محق ، أستخدم عنوان url: /file-events?file_name=foo
لأنني أعتقد أن الكود قد تم تحديده بالفعل ، يجب أن يستخدم حقل اسم_الملف الرموز.

نعم. إنه أمر غير منطقي في البداية ، لكن التغيير ضروري لأنه يمكنك استخدام بناء جملة القاموس لتحديد عوامل تصفية متعددة. على سبيل المثال،

class MyFilter(django_filters.FilterSet):
    class Meta:
        model = FileEvent
        fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}

يمكّنك هذا من تشغيل استعلامات مثل /file-events?file_name__istarswith=foo&file_name__iendswith=log

حسنًا ، لقد حصلت عليه ، والرمز ['icontains', 'istartswith', 'iendswith',] هو مجرد قائمة أنواع استعلام مدعومة. إذا لم يستخدم الاستعلام أي عنصر من عناصر القائمة ، فسيتجاهلها django-filter.

شكرا جزيلا :-)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات