django-rest模型视图集合列表操作如果传递查询参数则引发404



如果我传递任何查询参数,则获得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)

感谢朋友们对我的问题的反馈

最新更新