代码之家  ›  专栏  ›  技术社区  ›  yierstem

Django Rest框架序列化程序create()未触发

  •  2
  • yierstem  · 技术社区  · 7 年前

    class MyModelSerializer(serializers.ModelSerializer):
        user = UserSerializer()
    
        def create(self, validated_data):
            print("TEST")
            MyModel, created = MyModel.objects.get_or_create(**validated_data)
            return MyModel
    
        class Meta:
            model = MyModel
            fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)
    

    以及以下视图集:

    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    

    POST 请求与指定的viewset对应的端点 create() 方法完全不起作用。我试着在控制台上打印出来 TEST 如你所见,但什么都没有。

    有人知道这种奇怪的行为吗?

    谢谢你!

    编辑: API调用:

    return axios({
      method: 'post',
      url: 'http://localhost:8000/api/mymodel/',
      data: {
         title: this.title,
         movie: this.id,
         text: this.text,
         user: this.user
    }
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   Enthusiast Martin    7 年前

    如果在视图集中查看POST处理的实现,可以发现:

        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    

    你的 create 方法在序列化程序验证数据后调用。

    你看到的错误( )是打电话的结果 serializer.is_valid 从上面的片段。

    因此,它永远不会给你的 创造 . 你的克雷特会被称为 self.perform_create() 从上面的这个片段。

        2
  •  2
  •   yierstem    7 年前

    user = UserSerializer() user_username = serializers.ReadOnlyField(source='user.username') :

    class ReviewSerializer(serializers.ModelSerializer):
        user_username = serializers.ReadOnlyField(source='user.username')
    
        class Meta:
            model = Review
            fields = ('pk', 'title', 'user', 'user_username', 'movie', 'timestamp', 'review_text',)
    

    让我头疼,所以我就没事了。我将检查Entushiast Martin答案作为解决方案,因为他们驱使我找到了实际答案。非常感谢。

    解决了的。

        3
  •  0
  •   Paul Tuckett    7 年前

    这可能是因为您已经准备好了某种错误处理,因为编写def create函数的方式将抛出一个错误。我测试了下面的代码,它对我很有效,请尝试一下:

    class MyModelSerializer(serializers.ModelSerializer):
        user = UserSerializer()
    
        class Meta:
            model = MyModel
            fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)
    
        def create(self, validated_data):
            print("TEST")
            data = validated_data
            data, created = MyModel.objects.get_or_create(**data)
            return data