django - Django REST Framework - 将额外参数传递给操作
问题描述
我正在使用Django 2.0
和Django 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']
解决方案
如果您不能/不想/无论如何安装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
推荐阅读
- apache-kafka - org.apache.kafka.common.errors.SerializationException:无法反序列化密钥
- excel - 在 Word 中返回表格之前的行
- android - 每当我按下返回按钮时,JSON 的片段就会增加
- reactjs - 需要将 react-router 历史添加到 useEffect 的依赖数组吗?
- python - 修改模块中的变量以供以后使用的pythonic方法是什么?
- python - 我尝试打开一个python文件并得到了这个,请任何人帮忙
- entity-framework-core - 从数据库中显式选择模型时,EF Core 连接值为空
- php - Laravel“ValueError - 路径不能为空”
- c - 当我将一个新字段附加到 C 结构时,它是否保证不会更改原始成员的布局
- macos - curl:(56)OpenSSL SSL_read:操作超时,errno 60