【问题标题】:How to change the default search query parameter in URL in Django REST framework?如何更改 Django REST 框架中 URL 中的默认搜索查询参数?
【发布时间】:2020-01-02 10:44:06
【问题描述】:

在 Django REST 框架中。默认情况下,它在搜索任何内容时在 URL 中使用 - /?search=。 例如http://127.0.0.1:8000/api/branches/?search=RTGS 并且这个 url 成功地得到了结果。 但是我需要把网址改成http://127.0.0.1:8000/api/branches/autocomplete?q=RTGS

在文档中,https://www.django-rest-framework.org/api-guide/settings/#search_param 假定它是默认设置的。 https://www.django-rest-framework.org/api-guide/settings/#search_paramd 我们可以改变。 我想知道怎么做。

谢谢

https://www.django-rest-framework.org/api-guide/settings/#search_param

urls.py 从 django.urls 导入路径,包括 从 。导入视图 从 rest_framework 导入路由器

router = routers.DefaultRouter()
# router.register('bank', views.BankView)
router.register('branches/autocomplete', views.BankDetailView)
# router.register('branches/list', views.BankAPIListView)



urlpatterns = [
    path('api/', include(router.urls)),

]

views.py

from django.shortcuts import render, redirect
from rest_framework import viewsets
from .models import Branches
from .serializers import BranchesSerializer
from rest_framework import filters
from rest_framework.filters import OrderingFilter
from rest_framework.pagination import PageNumberPagination  
# from django_filters.rest_framework import DjangoFilterBackend





class BankDetailView(viewsets.ModelViewSet):
    queryset = Branches.objects.all()
    serializer_class = BranchesSerializer
    filter_backends = [filters.SearchFilter, OrderingFilter]
    # Partial Search with the field in branch
    search_fields = ['^branch']
    # Ordering Filter field by ifsc in ascending order
    # filter_backends = [DjangoFilterBackend]
    # filterset_fields = ['ifsc']

序列化器.py

from rest_framework import serializers
from .models import Branches

class BranchesSerializer(serializers.HyperlinkedModelSerializer):
    class Meta :
        model = Branches
        fields = ['url' ,'ifsc', 'bank_id', 'branch', 'address', 'city', 
'district', 'state']

http://127.0.0.1:8000/api/branches/autocomplete?q=RTGS&limit=3&offset=0

【问题讨论】:

    标签: python-3.x rest django-models django-rest-framework django-2.2


    【解决方案1】:

    来自the docs

    默认情况下,搜索参数被命名为'search',但这可能会被SEARCH_PARAM 设置覆盖。

    因此,在您的settings.py

    REST_FRAMEWORK = {
        'SEARCH_PARAM': 'q'
    }
    

    编辑

    这里你可以看到实际的代码:

    设置:https://github.com/encode/django-rest-framework/blob/master/rest_framework/settings.py#L68

    过滤器:https://github.com/encode/django-rest-framework/blob/master/rest_framework/filters.py#L42

    【讨论】:

    • 我添加了这个。并再次搜索。结果与127.0.0.1:8000/api/branches/?search=RTGS 相同。我尝试更改相同的内容,但不会发生任何事情。在设置之前是否有任何额外的东西要添加到 settings.py 中。
    • 它工作正常。如果我想让链接看起来像这样怎么办; 127.0.0.1:8000/api/branches/autocomplete?q=RTGS
    • @ManishGupta 好吧,我看到您已经在路由器中注册了您的BankDetailView,但路由器仅用于视图集。尝试在urls.py 中将其注册为urlpatterns = [] 内的简单path('branches/autocomplete', BankDetailView.as_view(), name='bank-detail')
    【解决方案2】:

    如果您只想在一个视图中更改查询参数键,您可以扩展SearchFilter,然后将其添加到视图的filter_backends

    class CustomSearchFilter(SearchFilter):
        search_param = "q"
    
    
    class MyListView(ListAPIView):
        # ...
        filter_backends = [CustomSearchFilter]
        # ...
    

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2019-12-24
      • 2017-10-06
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多