首页 > 解决方案 > Django 视图集。perform_create fun中如何从路径中获取id参数

问题描述

我正在尝试使用 VIEWSETS 库在 Django 中进行 REST。我创建了一个运行良好的 Container 模型。Container 与 ContainerModerator 模型相关联。端点应该是:

POST 容器/{container_id}/moderators

ContainerModerator 中的字段之一是 container_id。我想从路径中得到它。

以下是我现在所拥有的。我尝试了不同的方式到达那里。我也读过类似的帖子,通常是针对 VIEWSETS 以外的图书馆。我是一个初学者,我想知道对于这种情况是否有一个简单、优雅的解决方案让我很容易理解?我应该使用 APIVIEW 或 GenericAPIView 等其他库吗?

楷模:

class ContainerModerator(models.Model):
  moderator_id = models.ForeignKey(settings.AUTH_USER_MODEL, 
                 on_delete=models.CASCADE)
  container_id = models.ForeignKey(Container, on_delete=models.CASCADE)

序列化器:

class ContainerModeratorSerializer(serializers.ModelSerializer):

  class Meta:
    model = models.ContainerModerator
    fields = '__all__'

意见:

class ContainerModeratorViewSet(viewsets.ModelViewSet):
  serializer_class = serializers.ContainerModeratorSerializer
  queryset = models.ContainerModerator.objects.all()

  def perform_create(self, serializer):
    serializer.save()

网址:

router.register('v1/containers/<int:container_id>/moderators', 
views.ContainerModeratorViewSet)

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

标签: djangodjango-rest-frameworkdjango-rest-viewsets

解决方案


您可以从中获取 container_idself.kwargs['container_id']并使用 container_id 搜索 Container 实例。特别是您的视图集中需要这样的东西:

class ContainerModeratorViewSet(viewsets.ModelViewSet):
     serializer_class = serializers.ContainerModeratorSerializer
     queryset = models.ContainerModerator.objects.all()

     def get_object(self):
         #Override this method to get your cantainer instance
         return get_object_or_404(Container, id=self.kwargs['pk']) 

     def post(self, request, *args, **kwargs)):

        instance = self.get_object()
        data = {
           container : instance.id,
           moderator : request.user
        }

        return self.create(data)

    def create(self, data):
       serializer = self.get_serializer(data=data)

       self.permform_create(serializer)
       return Response(serializer.data)

    def perform_create(self, serializer):
        serializer.save()

只需仔细阅读 GenericAPIView、ModelViewSet 和 ViewMixins 的源代码,看看它们是如何相互连接的。


推荐阅读