2017-07-25 50 views
2

我正在使用Django rest框架API,我試圖通過first_name或由last_name或兩者進行過濾器。 這是我ContactViewSet.py:Django過濾器後端

class ContactViewSet(viewsets.ModelViewSet): 
    queryset = Contact.objects.all() 
    serializer_class = ContactSerializer 
    filter_backends = (DjangoFilterBackend,) 
    filter_fields = ('first_name', 'last_name') 
    lookup_field = 'idContact' 

我DRF的設置:

REST_FRAMEWORK = { 
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), 
} 

我actuel請求的URL看起來像:

http://localhost:8000/api/v1/contacts/?first_name=Clair&last_name=Test 

但是我正在尋找這樣的事情:

http://localhost:8000/api/v1/contacts/?first_name=Cl**&last_name=Tes** 

任何幫助將不勝感激..

+0

無法測試該ATM ...沒有'first_name__startswith = Cl'工作?.. – Sayse

+0

沒有,問題是,我必須填寫準確的FIRST_NAME過濾 – Naella

+0

如果你只關心通過查詢參數過濾,然後編寫一個自定義管理器將做你想做的任何事情。 – zaidfazil

回答

0

我通過修改我的類ContactFilter來解決我的問題:

import django_filters 
from .models import Contact 

class ContactFilter(django_filters.FilterSet): 
    class Meta: 
     model = Contact 
     fields = { 
      'first_name': ['startswith'], 
      'last_name': ['startswith'], 
     } 
     together = ['first_name', 'last_name'] 

在我看來,我必須這樣做:

class ContactViewSet(viewsets.ModelViewSet): 
    queryset = Contact.objects.all() 
    serializer_class = ContactSerializer 
    filter_class = ContactFilter 

我的請求的URL看起來像:

http://localhost:8000/api/v1/contact/?first_name__contains=Cl&last_name__contains=Tes 

但我仍然不知道如果我在Django中可以有這樣的東西

http://localhost:8000/api/v1/contacts/?first_name=Cl**&last_name=Tes** 
2

我認爲DjangoFilterBackend主要是基於等同的過濾。但你可以customize the filtering method

同樣在DRF中,對於非精確過濾,有SearchFilter,它使默認情況下不區分大小寫的部分匹配搜索。

+0

感謝您的回覆!但是SearchFilter不允許我有這樣的請求url:http:// localhost:8000/api/v1/contacts /?first_name = Cl **&last_name = Tes ** – Naella

+0

然後自定義過濾django-filter可能是最好的方法,[本文](https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html)可以幫助你做到這一點,以及我的文檔鏈接在答案中。 –

+0

請你看看下面的答案。謝謝 – Naella

1

我與ViewSets工作,我contactViewSet樣子:

class ContactViewSet(viewsets.ModelViewSet): 
    serializer_class = ContactSerializer 
    filter_class = ContactFilter 

    def get_queryset(self): 
     return Contact.objects.all() 

我的過濾器看起來像

from .models import Contact 

class ContactFilter(django_filters.FilterSet): 
    first_name = django_filters.CharFilter(method="my_custom_filter") 

    class Meta: 
     model = Contact 
     fields = ['first_name'] 

    def my_custom_filter(self, queryset, first_name, value): 
     return queryset.filter(**{ 
      first_name: value, 
     }) 

但仍然有同樣的問題

+0

如果你有一個新的問題,請點擊[問問題](https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/16833094) –