首页 > 解决方案 > Django REST Framework - 将额外参数传递给操作

问题描述

我正在使用Django 2.0Django REST Framework

我创建了一个操作方法来从数据库中删除特定对象

联系人/views.py

class ContactViewSet(viewsets.ModelViewSet):
    serializer_class = ContactSerializer
    permission_classes = (IsAuthenticated, AdminAuthenticationPermission,)

    # others actions goes here

    @action(methods=['delete'], detail=False, url_path='delete_phone/<phone_pk>/')
    def delete_phone(self, request, pk=None):
        contact = self.get_object()
        print(contact)
        print(pk)
        print(self.kwargs['phone_pk'])
        return Response({'status': 'success'})

应用程序/urls.py

router.register(r'contacts', ContactViewSet, 'contacts')

api_urlpatterns = [
    path('', include(router.urls)),
]

但是当我访问

DELETE: http://url/api/contacts/delete_phone/1/

它给出了page not found错误。

在错误页面中,列出了已尝试的 url 模式

api/ ^contacts/delete_phone/<phone_pk>//$ [name='contacts-delete-phone']
api/ ^contacts/delete_phone/<phone_pk>\.(?P<format>[a-z0-9]+)/?$ [name='contacts-delete-phone']

标签: djangodjango-rest-framework

解决方案


如果您不能/不想/无论如何安装drf-nested-routers,您可以通过执行以下操作来实现:

@action(detail=True,
        methods=['delete'],
        url_path='contacts/(?P<phone_pk>[^/.]+)')
def delete_phone(self, request, phone_pk, pk=None):
    contact = self.get_object()
    phone = get_object_or_404(contact.phone_qs, pk=phone_pk)
    phone.delete()
    return Response(.., status=status.HTTP_204_NO_CONTENT)

诀窍是将正则表达式放在装饰器的url_path参数中并将其传递给装饰方法(避免使用 justpk否则它将与第一个 pk 冲突)

经测试:

Django==2.0.10
djangorestframework==3.9.0

推荐阅读