Django Rest Framework - фильтрация по URL-адресу - get () получил неожиданный аргумент ключевого слова 'имя пользователя'

Aug 18 2020

У меня есть модель django, Messagesи я хочу фильтровать сообщения по параметру url: имени пользователя автора сообщения.

Но я получаю:

TypeError at /inbox-data/johndoe/
get() got an unexpected keyword argument 'username'

url(r'^inbox-data/(?P<username>.+)/$', InboxApiView.as_view())

class InboxApiView(ListAPIView):
    def get(self, request, format=None):
        url_param           = self.kwargs['username']
        own_mx              = Message.objects.filter(sender__username=url_param)
        mx_serializer       = MXSerializer(own_mx, many=True)
        message_data        = mx_serializer.data
        data = {
            'message_data':
            [{
                'content'   : md['content'],
                'sender'    : md['sender'],
                'recipient' : md['recipient'],
                'sent_at'   : md['sent_at'],
                'read_at'   : md['read_at']
            } for md in message_data],
        }
        return Response(data)

class MXSerializer(ModelSerializer):
    sender  = SerializerMethodField()
    recipient = SerializerMethodField()
    class Meta:
        model = Message
        fields = '__all__'

def get_sender(self,obj):
    return str(obj.sender.username)

def get_recipient(self,obj):
    return str(obj.recipient.username)

Я слежу за этой документацией:

https://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-url


Traceback (most recent call last):
  File "/Library/Python/3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Library/Python/3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Library/Python/3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Python/3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Library/Python/3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Library/Python/3.7/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/Library/Python/3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Library/Python/3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/Library/Python/3.7/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)

Спасибо за любые предложения

Ответы

2 Lewis Aug 18 2020 at 19:50

Вам нужно включить *argsи **kwargsв свой метод InboxApiViewкласса get.

Вот так:

def get(self, request, format=None, *args, **kwargs):
    [...]

Без этого usernameнельзя извлечь ключевые слова из аргументов.