簡體   English   中英

Django的現場多個過濾器

[英]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 已替換為Filtermethod參數 因此,針對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM