【问题标题】:DjangoREST APIView - different url params for different methodsDjango REST APIView - 不同方法的不同 url 参数
【发布时间】:2021-06-10 22:19:51
【问题描述】:

我有一个支持读取和创建操作的 DjangoREST APIView。像这样的:

class FirebaseUser(APIView):
  ...
  get(request):
    ...
   
  post(request):
    ... 

urls.py:

...
path('user/', views.FirebaseUser.as_view()),
...

我需要一个 API 来接受以用户 ID 作为 url 参数的读取请求

GET .../api/user/<userId>

但是对于创建操作,还没有用户 ID,我需要这样的东西

POST .../api/user/

根据方法不同,让我的 APIView 以不同方式处理 url 参数的最佳方法是什么?

【问题讨论】:

  • 您可以轻松地在您的 urls.py 中多声明一个路径,以支持GET /api/user/<userId>。然后在您的FirebaseUser.get() 方法中,您可以使用self.params['userId']self.query_params['userId']self.request.GET.get('userId') 访问该用户ID(至少其中一个可以工作)。

标签: django django-rest-framework


【解决方案1】:

您可以在您的views.py 中定义这样的ModelViewSet

from rest_framework import viewsets

class FirebaseUserViewSet(viewsets.ModelViewSet):
    queryset = FirebaseUser.objects.all() # or whatever should your queryset be
    serializer_class = FirebaseUserSerializer

然后,在您的 urls.py 中注册视图集:

from django.urls import path
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'user', FirebaseUserViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

这将创建一些新的 API 端点,您将能够执行所有 CRUD 操作。

我建议在official docs 中阅读更多关于ModelViewSets 的信息。

另外,如果您只需要某些操作,例如只需要 readcreate,您可以考虑仅从 rest_framework.mixins 扩展某些混合(阅读更多 here)。

【讨论】:

  • 关键是我无法使用 ModelViewSet,因为我没有使用自己的数据库,而是将请求重定向到 Firestore……但 ViewSet 成功了
【解决方案2】:

所以,我想出了使用 ViewSet 而不是 APIView。 这是它现在的样子: urls.py

    path('user/', views.FirebaseUser.as_view({'post': 'create'})),
    path('user/<str:pk>', views.FirebaseUser.as_view({'patch': 'update', 'delete': 'destroy'})),

views.py

class FirebaseUser(ViewSet):
    authentication_classes = [...]
    permission_classes = [...]

    @staticmethod
    def create(request):
        ...

    @staticmethod
    def update(request: Request, pk=None):
        uid = pk
        ...

    @staticmethod
    def destroy(request: Request, pk=None):
        uid = pk
        ...

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2016-08-31
    • 2021-09-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多