如何在DRF中发出指向同一Django应用程序

时间:2016-11-26 14:35:26

标签: django rest django-rest-framework

非常快速的问题是如何在Django-rest-framework中嵌套请求。我有一个结束点A,我在POST上,并希望再次请求在其序列化程序perform_create方法中指向B.这个API端点实际上是在同一个Django应用程序中编写的。

  • API A的序列化程序

    class ReadingCreate(CreateAPIView):
    
        permission_classes = [IsOwnerOrReadOnly]
        serializer_class = ReadingCreateSerializer
    
        def perform_create(self, serializer):
            #HERE I WANT TO MAKE REQUEST TO POINT B
            serializer.save(user_profile= UserProfile.objects.get(user=self.request.user))
    

我熟悉请求等库,但我希望有更好的方法,因为我还需要发送令牌进行身份验证,我就像在同一个文件中。这个问题看似简单,但我显然不知道如何正确地做到这一点。

更新 要解释更多,"请求"我应该通过ReadingCreateSerializer找到一本基于isbn的书。但首先我需要找一本书(Google API),然后将其保存到我的数据库中。这需要完成,因为书模型独立于UserProfile对象而Reading不是(有附加信息)。这就是我的要求"确实。

当然,这可以通过客户的两个连锁请求来完成,但我不想这样做。

  • 串行器:

    class ReadingCreateSerializer(serializers.HyperlinkedModelSerializer):
        isbn = serializers.CharField(required=True, max_length=20)
    
        class Meta:
            model = Reading
            fields = ['isbn', 'notes', 'rating', 'start_reading_date', 'end_reading_date']
    
  • 我根据答案尝试的内容:视图的一部分和序列化程序的一部分

    def perform_create(self, serializer):
        self.request.method = 'POST'
        serializer.save(user_profile=UserProfile.objects.get(user=self.request.user), request=self.request)
    
    def save(self, **kwargs):
        isbn = self.validated_data['isbn']
        request = kwargs.get("request", {})
        request.data = {'isbn': isbn}
        post_book(request)
    

我发现我无法将视图(在我的示例中为post_book)导入序列化程序,我猜Django不允许这样做。

1 个答案:

答案 0 :(得分:2)

这将执行您的API类。

APIClassB.as_view()(self.request)

如果您需要更改请求方法

self.request.method = 'POST'
APIClassB.as_view()(self.request)