Django Rest Framework-如何调用方法模型

时间:2018-11-07 01:10:20

标签: python django django-rest-framework

我需要从模板调用方法。我有以下代码:

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的TypeError patch()缺少1个必需的位置参数:'id'“

隧道尽头的灯是什么?

谢谢大家

1 个答案:

答案 0 :(得分:1)

您需要修复您的网址:

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(对象引用)提供“自我”,Django提供“请求”,URL需要提供“ id”。帖子中的URL映射不包含“ id”,因此Django抱怨缺少参数。 来自Ben的评论