我有这个类视图,它非常适合创建和列出SiteGroup的对象:
但是我需要一种方法来对单个SiteGroup对象及其关联的对象执行多项操作。因此,我尝试创建一个用@action装饰的方法(如文档所建议)。
根据文档,这将自动生成中间网址。但是,它不起作用。
当我尝试访问(假设423是现有的SiteGroup对象)时:
http://127.0.0.1:8000/api/site-groups/423/replace_product_id/?product_id=0x345
找不到网址。
我也尝试过自己生成urls.py中的URL,但是没有运气。
有人可以告诉我问题出在哪里吗?我浏览了所有文档,没有发现任何线索。非常感谢。
class SiteGroupDetail(generics.ListCreateAPIView):
queryset = SiteGroup.objects.all()
parser_classes = (MultiPartParser, FormParser, JSONParser)
serializer_class = SiteGroupSerializer
authentication_classes = (authentication.TokenAuthentication,)
@action(detail=True, methods=['post'], url_path='replace_product_id', permission_classes=[IsSuperUser], url_name='replace_product_id')
def replace_product_id(self, request, pk=None, device_type=None):
serializer = SiteGroupSerializer(data=request.data)
product_id = self.request.query_params.get('product_id', None)
print("replace_product", product_id, device_type, pk, flush=True)
return Response({"hello":product_id})
我的urls.py
from django.conf.urls import url, include
from api import views, routers
router = routers.SimpleRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
enter code here
url(r'^site-groups/', views.SiteGroupDetail.as_view()),
url(r'^site-groups/(?P<pk>[0-9]+)/$', views.SiteGroupDetail.as_view()),
]
答案 0 :(得分:1)
一件事,路由器应该在呼叫
super(OptionalSlashRouter, self).__init__()
您现在所称的SimpleRouter父级的__init__
,跳过了SimpleRouter.__init__
中的逻辑
对此进行更改,看看它是否开始起作用
实际上,当您使用python 3时,它可能只是
super ().__init__()