[英]django multiple filters on field
我正在做一個簡單的過濾器-
filter.py
class TblserversFilter(django_filters.FilterSet):
name = django_filters.CharFilter(name="servername", lookup_type="exact")
class Meta:
model = Tblservers
fields = ['servername']
如果可能的話,我想做的是與該字段關聯兩個lookup_types。 具體來說,我想要exact
AND contains
,然后根據過濾器以某種方式替換運算符。
name=serverabc
將是一個精確搜索和name~abc
將是一個模糊搜索。
您可以執行method_filter ,然后為過濾器查詢添加不同的符號作為客戶端所需的確切和圖標框以及其他過濾器的前綴。
由於代碼勝過一千個單詞:
exact_prefix = '#'
icontains_prefix = '~'
class TblserversFilter(django_filters.FilterSet):
name = django_filters.MethodFilter(
action=name_filter)
def name_filter(self, value):
if value:
value_prefix = value[0]
if value_prefix == exact_prefix:
return self.filter(name=value)
elif value_prefix == icontains_prefix:
return self.filter(name__icontains=value)
# this can continue for all the types of filters you want
else:
return self.filter(name=value)
else:
return self.filter(name=value)
class Meta:
model = Tblservers
fields = ['servername']
編輯:
在django-filter 1.0中, MethodFilter
已替換為Filter
的method
參數 。 因此,針對v1.0重寫的解決方案如下(未經測試):
exact_prefix = '#'
icontains_prefix = '~'
class TblserversFilter(django_filters.FilterSet):
name = django_filters.CharFilter(
method='name_filter')
def name_filter(self, qs, name, value):
if value:
value_prefix = value[0]
if value_prefix == exact_prefix:
return qs.filter(name=value)
elif value_prefix == icontains_prefix:
return qs.filter(name__icontains=value)
# this can continue for all the types of filters you want
else:
return qs.filter(name=value)
else:
return qs.filter(name=value)
class Meta:
model = Tblservers
fields = ['servername']
首先,我對無恥的庫自插表示歉意。
在某些時候,我試圖在Django過濾器中執行類似的操作,但是該解決方案比預期的要復雜得多。 我最終創建了自己的庫以在Django中進行過濾,該庫本身支持您正在尋找的確切功能-django-url-filter 。 它的API與django-filters非常相似:
from django import forms
from url_filter.filter import Filter
from url_filter.filtersets import ModelFilterSet
class TblserversFilter(FilterSet):
name = Filter(form_field=forms.CharField(max_length=15), lookups=['exact', 'contains'])
class Meta(object):
model = Tblservers
fields = ['name', 'servername']
請注意,URL看起來會有些不同:
?name=foo # exact
?name__exact=foo
?name__contains=foo
另外,您將需要手動調用過濾器集以過濾查詢集:
fs = TblserversFilter(data=query, queryset=...)
filtered_qs = fs.filter()
URL參數的語法與Django ORM非常相似。 您可以查看文檔以獲取更多示例。 希望它可能有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.