أستخدم المثال في المستند:
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')
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.
شكرا جزيلا :-)
التعليق الأكثر فائدة
مرحبًا zhangqunshi ، يبدو أنك تستخدم الإصدار 2.0.0.dev1 المسبق. أنت محق ، لقد أصبح
field_name
name
field_name
. لم يتم تحديث المستندات لتعكس هذا (وهو جزء من سبب كونه إصدارًا مسبقًا).ليس من السهل تصحيح أخطاء
FileEvent
بدون رؤية النموذج الفعلي. ماذا يحدث عند تنفيذ الاستعلام التالي؟