如果我传递任何查询参数,则获得404
视图.py
class BusinessViewSet(ModelViewSet):
queryset = Business.objects.all()
permission_classes = [IsAuthenticated, HasUsernamePermission]
filter_backends = [SearchFilter, DjangoFilterBackend, DistanceFilterBackend]
search_fields = ['username']
ordering_fields = ['name']
pagination_class = LimitOffsetPagination
filterset_fields = ['name', 'category']
def get_serializer_class(self):
if self.request.method == 'POST':
return BusinessCreateSerializer
return BusinessSerializer
urls.py
from rest_framework.routers import DefaultRouter
from businesses.api.views import BusinessViewSet
app_name = "businesses"
router = DefaultRouter()
router.register(r'', BusinessViewSet,basename="business")
urlpatterns = []
urlpatterns += router.urls
例如,如果我请求
/api/businesses/
-响应代码为200/api/businesses/?search=a
-响应代码为404
如果您有django_extensions,请使用show_urls
命令进行进一步检查。
看起来您使用的是DjangRestFramework默认的SearchFilter
后端,因此您必须将search_fields
添加到BusinessViewSet
类中。
此外,请从浏览器中检查路线,查看表单及其按钮("过滤器"按钮(是否可用,是否正常工作。
DjangRestFramework搜索和过滤表单
文档中提到
只有在视图设置了search_fields属性时,才会应用SearchFilter类。
由于没有search_fields
,因此不使用SearchFilter
。
我调试了我的代码,发现了我的问题
HasUsernamePermission代码
from rest_framework.permissions import BasePermission
from django.utils.translation import gettext_lazy as _
from django.urls import resolve
class HasUsernamePermission(BasePermission):
"""
User must has username
"""
message = _('User must has username')
def has_permission(self, request, view):
# Instance must have an attribute named `owner`.
if resolve(request.get_full_path()).url_name == 'user-detail'
and request.method == 'PATCH': # user probably set username
return True
return bool(request.user.username)
查询传递的参数时,解析方法引发404异常我把我的代码改为向下吹,我的问题已经解决了
class HasUsernamePermission(BasePermission):
"""
User must has username
"""
message = _('User must has username')
def has_permission(self, request, view):
# Instance must have an attribute named `owner`.
if view.__class__.__name__ == 'UserViewSet' and view.action == 'detail' and request.method == 'PATCH': # user probably set username
return True
return bool(request.user.username)
感谢朋友们对我的问题的反馈