美好的一天!
我有一个像这样的 detail_route View :
class PostView(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
@detail_route(methods=['POST'])
def like(self, request, pk=None):
post = self.get_object()
post.like(request.user)
return Response({'result': 'success'})
所以,like 函数的 url 是/api/posts/{id}/like
我尝试像这样用 django.test.TestCase 测试它:
post = Post.objects.first()
url = reverse('api:post-detail', args=[post.id])
url = urljoin(url, 'like')
response = self.client.post(url, content_type='application/json', follow=True)
我必须使用 follow=True 因为我得到代码 300 重定向,但是当我需要 POST 时重定向返回我的 GET 请求。 我尝试使用 APIClient 和 APIRequestFactory 并得到相同的错误或 myapp.models.DoesNotExist
坦克引起你的注意!
请您参考如下方法:
你得到 300 分的事实应该表明你做错了什么。
与其反转主 URL,然后手动加入详细路由扩展,不如直接反转到您想要的完整 URL。作为the docs for detail_route 显示,该装饰器以 <model>-<detail-method> 的形式为您提供命名路由.所以:
url = reverse('api:post-like', args=[post.id])
response = self.client.post(url, content_type='application/json')
