Django Rest Framework - Как вызвать метод модели - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужно вызвать метод из шаблона. У меня есть следующие коды:

models.py

class Operation(Base):
    ...
    hash_code = models.UUIDField(default=uuid4)
    ...

    def open_operation(self, user):
       ...
       pass

views.py

class OperationOpenView(APIView):
"""
patch:
"""

    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = OperationOpenFilter

    def patch(self, request, id):
        user = request.user
        operation = Operation.objects.get(pk=id)
        serializer = OperationOpenSerializer(operation, 
                     data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            serializer.instance.open_operation(user)
            return Response(data={'operation': operation, 'user': user}, status=status.HTTP_200_OK)
        else:
            return Response(code=400, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class OperationOpenSerializer(serializers.ModelSerializer):
    class Meta:
        model = Operation
        fields = ('id', )
        depth = 1

filters.py

class OperationOpenFilter(filters.FilterSet):

id = filters.NumberFilter(
    label='id',
    required=True,
    help_text='ID'
)

class Meta:
    model = Operation
    fields = ['id',]

urls.py

path(r'operations/open', views.OperationOpenView.as_view()),

tests.py

@pytest.mark.django_db
def test_view(client_api_logged):
    response = client_api_logged.patch('/api/operations/open', kwargs= 
    {'id': '1'})
    assert response.status_code == 200

Я не получаю его на работу, получаю ошибку:

"Ошибка типа в / api / operations / open patch () отсутствует 1 обязательный позиционный аргумент: 'id' "

есть ли свет в конце туннеля?

спасибо всем

1 Ответ

0 голосов
/ 07 ноября 2018

Вам нужно исправить свой URL:

path(r'operations/open/<int:id>/', views.OperationOpenView.as_view()),

А в tests.py:

response = client_api_logged.patch('/api/operations/open/1/', kwargs={'id':1})

Пояснение:

Метод patch принимает 3 параметра (self, request, id). Python (ссылка на объект) предоставляет «self», Django предоставляет «request», а URL-адрес должен предоставлять «id». В отображении URL в сообщении не было идентификатора, поэтому Джанго жалуется на отсутствующий параметр. из комментария Бена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...