Django конечная точка REST API для указанного c url - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать конечную точку для сообщения и его комментариев в следующем формате:

/posts (view all posts)
/posts/{id} (view post by id)
/posts/{id}/comments (view comments for a post)

Первые 2 работают, но для последнего у меня /comments, а не URL-адрес, который я бы вроде, и я не уверен, как go об этом, я думаю, мне нужно изменить мои модели для этого.

Мои текущие модели (по умолчанию Django User):

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title


class PostComment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    comment = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.post.title

И URL-адреса:

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'posts', views.PostViewSet)
router.register(r'comments', views.PostCommentViewSet)

Изменить: это наборы просмотра

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().order_by('id')
    serializer_class = UserSerializer


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('created_at')
    serializer_class = PostSerializer


class PostCommentViewSet(viewsets.ModelViewSet):
    queryset = PostComment.objects.all().order_by('created_at')
    serializer_class = PostCommentSerializer

Ответы [ 4 ]

1 голос
/ 06 августа 2020

Ваше представление должно быть примерно таким -

class PostCommentViewSet(viewsets.ModelViewSet):
    queryset = PostComment.objects.all().order_by('created_at')
    serializer_class = PostCommentSerializer

    @action(detail=True)
    def comments(self, request, id=None):
        ....

Более подробную информацию можно найти в документации DRF здесь - https://www.django-rest-framework.org/api-guide/routers/#routing -for-extra-actions

1 голос
/ 06 августа 2020

Вы можете достичь этого, написав настраиваемые действия набора просмотров - (drf do c) ,

from rest_framework.decorators import action
from rest_framework.response import Response


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('created_at')
    serializer_class = PostSerializer

    <b>@action(detail=True, url_path='comments', url_name='post-comments')
    def comments(self, request, *args, **kwargs):
        queryset = PostComment.objects.filter(post=kwargs['pk'])
        serializer = PostCommentSerializer(queryset, many=True, context= {'request':request, 'view':self})
        return Response(data=serializer.data)</b>
0 голосов
/ 06 августа 2020

Я думаю, вы забыли зарегистрировать параметры маршрута viewset с помощью декоратора действий

https://www.django-rest-framework.org/api-guide/viewsets/#marking -extra-actions-for-routing

он должен работать, если у вас было в вашем наборе

from rest_framework.decorators import action

@actions(detail=True)
def comments(self, request, pk):
  # things to do here
0 голосов
/ 06 августа 2020

Если вы хотите использовать маршрутизатор, то, вероятно, этого можно достичь, реализовав собственный маршрутизатор, как в этом примере: https://www.django-rest-framework.org/api-guide/routers/#example

...