django - 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))
]
解决方案
您可以从中获取 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 的源代码,看看它们是如何相互连接的。
推荐阅读
- c++ - 使用 AWS-SDK-CPP 从 LAmbda 向 SQS 发送消息
- python - Pandas:为具有多个 ID 的前一周值创建新列
- .net - 可执行文件有网络相关或特定于实例的错误
- haskell - 为什么 a -> b -> c 函数参数可以接受 a -> a 类型?
- java - 多线程 RabbitMQ 消费者
- c++ - 开源相机的 Gstreamer webrtc 管道问题
- javascript - 如何用新行停止 TinyMCE 格式化列表代码?
- r - 调整 LASSO 模型并使用 tidymodels 进行预测
- scala - 使用 kafka 模式注册表时我真的需要 avro4s 吗?
- node.js - 在 VS Code / Javascript with Node 中调试时看不到任何变量、调用堆栈