У меня есть это представление класса, которое отлично подходит для создания и перечисления объектов SiteGroup:
Но мне нужен метод для выполнения нескольких операций над одним объектом SiteGroup и объектами, связанными с ними. Поэтому я попытался создать метод, украшенный @action (как предложено в документах).
Согласно документам, это автоматически сгенерирует промежуточный URL. Тем не менее, это не работает.
Когда я пытаюсь получить доступ (учитывая, что 423 является существующим объектом SiteGroup):
http://127.0.0.1:8000/api/site-groups/423/replace_product_id/?product_id=0x345
URL не найден.
Я также попытался сгенерировать себе URL в urls.py, но безуспешно.
Может кто-нибудь сказать мне, где проблема? Я просмотрел все документы и не нашел подсказки. Большое спасибо.
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()),
]