django休息动作得到了意外的位置参数

时间:2018-12-09 14:39:01

标签: python django django-rest-framework

我有一个带操作的视图集,该视图集已定义为向用户添加朋友。但是我的网址有问题,请在http://localhost:8000/accounts/users/mercer/add_friend/上发送查询 并收到以下消息: add_friend()获得了意外的关键字参数“用户名”

我的ViewSet:

class UserViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'username'
    http_method_names = ['get', 'patch', 'post']

    @action(detail=True, methods=['post'])
    def add_friend(self, request):
        return Response('ok')

1 个答案:

答案 0 :(得分:2)

根据Django Viewsets documentation on marking extra actions for routing

  

与常规操作一样,额外的操作可能针对单个对象或整个集合。为了表明这一点,请将detail参数设置为True或False。路由器将相应地配置其URL模式。例如,DefaultRouter会将详细信息操作配置为在其网址格式中包含pk。

正如您声明的detail=True,是指此操作将应用在CustomUser对象中,而不是所有用户中。我认为您的帖子网址中已包含此内容,因为您似乎将“ mercer” 作为对象用户名传递。因此,您还必须期望在动作方法中将username作为参数传递:

@action(detail=True, methods=['post'])
def add_friend(self, request, username=None):
    # your code
    return Response('ok')