Я новичок в Джанго. Так что это может быть тривиальный вопрос.
Я строил urlpatterns следующим образом
router = DefaultRouter()
router.register('posts', views.PostViewSet)
urlpatterns = [
path('', include(router.urls))
]
Это создает URL-адреса, такие как api/posts и так далее.
Теперь я пытаюсь добавить к этому модель голосования. Для чего я хочу создать URL-адрес, например
api/posts/<id>/vote
Но я не хочу создавать путь вроде
urlpatterns = [
path('', include(router.urls)),
path('posts/<int:pk>/vote', views.SomeView)
]
Есть ли способ сделать это через router.register способ?





Сначала вы определите маршрутизатор по умолчанию так же, как вы определили.
router = DefaultRouter()
router.register('posts', views.PostViewSet, basename='posts')
urlpatterns = [
path('', include(router.urls))
]
Затем определите класс Serializer по мере необходимости.
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
Теперь определите пользовательский метод vote внутри PostViewSet с помощью разрешенных методов HTTP.
from rest_framework.response import Response
from rest_framework import viewsets, status
from rest_framework.decorators import action
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
@action(detail=True, methods=['Get'])
def vote(self, request, pk=None):
queryset = Post.objects.filter(pk=pk)
serializer = PostSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Теперь вы сможете получить доступ к голосованию с желаемым URL-адресом как api/posts/<pk>/vote