我刚加入DRF。
这是我的ViewSet(基于DRF官方文档的示例):
class AccountViewSet(viewsets.ViewSet):
def list(self, request):
queryset = User.objects.all()
serializer = AccountSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, email=None):
queryset = User.objects.all()
user = get_object_or_404(queryset, email=email)
serializer = AccountSerializer(user)
return Response(serializer.data)
字符串
数据库里有两个邮箱地址。
我的API客户端是httpie
。
当我向http://127.0.0.1:8000/api/accounts/
发送GET
请求时,我会收到这两封电子邮件。所以这部分工作正常。
然而,当我提供一个在数据库中不存在的电子邮件地址(如Params
或Headers
)时,我再次得到这两封电子邮件,而不是404
。
我做了一点研究,把代码改成这样:
class AccountViewSet(viewsets.ViewSet):
def list(self, request):
queryset = User.objects.all()
serializer = AccountSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, email=None):
queryset = User.objects.all()
try:
user = get_object_or_404(queryset, email=email)
except User.DoesNotExist:
return Response(status=404)
serializer = AccountSerializer(user)
return Response(serializer.data)
型
再一次,200
与这两封电子邮件。
即使我提供了一个电子邮件,确实存在,我得到了两个回应。
我不知道我错过了什么。
P.S:我的URL模式定义如下:
from rest_framework.routers import DefaultRouter
from .views import AccountViewSet
router = DefaultRouter()
router.register(r'accounts', AccountViewSet, basename='accounts')
urlpatterns = router.urls
型
1条答案
按热度按时间bogh5gae1#
email
在URL路由中没有被定义为关键字参数,因此当您尝试通过email
获取单个用户时,retrieve
方法永远不会被调用。您应该(解决方案1)覆盖
ViewSet
级别上的lookup_field
定义:字符串
或者(解决方案2)在
ViewSet
中定义一个自定义的route
/action
(然后你用route
/action
代替retrieve
):型
或者(解决方案3),您可以定义URL模式如下:
型