簡體   English   中英

Django REST API 端點,用於特定 Z572D4E421E5E6B9BC11D815E8A02711

[英]Django REST API endpoint for specific url

我正在嘗試為帖子及其評論創建一個端點,格式如下:

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

前 2 個工作,但對於最后一個,我有/comments而不是我想要的 url,我不知道如何 go 關於它,我想我需要改變我的模型。

我當前的模型(它使用默認的 Django 用戶):

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

和網址:

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

您可以通過編寫自定義視圖集操作來實現這一點--(drf doc)

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

    @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)

您的觀點應該與此類似 -

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

如果您想使用路由器,那么這可能可以通過實現自定義路由器來實現,例如: https://www.django-rest-framework.org/api-guide/routers/#example

我想你忘了用動作裝飾器注冊視圖集路由參數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM