Python django rest操作获得意外的位置参数

Python django rest操作获得意外的位置参数,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个带有action的viewset,它已定义用于向用户添加朋友。但我在url上遇到了问题,请发送post查询 并收到以下消息:add\u friend()收到一个意外的关键字参数“username” 我的视图集: class UserViewSet(viewsets.ModelViewSet): queryset = CustomUser.objects.all() serializer_class = UserSerializer lookup_field = '

我有一个带有action的viewset,它已定义用于向用户添加朋友。但我在url上遇到了问题,请发送post查询 并收到以下消息:add\u friend()收到一个意外的关键字参数“username”

我的视图集:

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')
根据:

与常规操作一样,额外操作可能针对单个对象或整个集合。要指出这一点,请将detail参数设置为True或False。路由器将相应地配置其URL模式。e、 例如,DefaultRouter将配置详细操作以在其URL模式中包含pk

当您声明
detail=True
时,表示此操作将应用于
CustomUser
对象,而不是应用于所有用户。我想你已经在你的帖子url中找到了这个,因为你似乎在传递“mercer”作为你的对象用户名。因此,您还必须期望
username
在操作方法中作为参数传递:

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

与常规操作一样,额外操作可能针对单个对象或整个集合。要指出这一点,请将detail参数设置为True或False。路由器将相应地配置其URL模式。e、 例如,DefaultRouter将配置详细操作以在其URL模式中包含pk

当您声明
detail=True
时,表示此操作将应用于
CustomUser
对象,而不是应用于所有用户。我想你已经在你的帖子url中找到了这个,因为你似乎在传递“mercer”作为你的对象用户名。因此,您还必须期望
username
在操作方法中作为参数传递:

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

谢谢你的回答。我前一段时间试图这么做,但遇到了另一个错误:“\uuuu init\uuuu()接受1个位置参数,但给出了2个”。你确定你也尝试过这样做吗?这个错误发生在哪里?哦,另一个问题是Response()。我从这里导入了它:“从请求导入响应”而不是“从rest\u framework.Response导入响应”。谢谢,你解决了我的问题谢谢你的回答。我前一段时间试图这么做,但遇到了另一个错误:“\uuuu init\uuuu()接受1个位置参数,但给出了2个”。你确定你也尝试过这样做吗?这个错误发生在哪里?哦,另一个问题是Response()。我从这里导入了它:“从请求导入响应”而不是“从rest\u framework.Response导入响应”。谢谢,你解决了我的问题