Django Rest Framework序列化器create()未触发

时间:2018-09-26 17:36:09

标签: django django-rest-framework django-serializer

我有以下序列化器

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请求时,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 个答案:

答案 0 :(得分:3)

如果您在ViewSet中查看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导致的。

因此,永远无法致电您的create。上方的这段代码会将您的脚架称为self.perform_create()的一部分。

因此,这意味着您正在尝试创建一个已经存在的用户。因此,在您的模型中,您具有唯一的用户名。

答案 1 :(得分:0)

这可能是因为您已进行某种错误处理,因为编写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

希望这会有所帮助!

答案 2 :(得分:0)

好的。我找到了替代方案。由于只需要用户对象中的用户名,因此我删除了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',)

user = UserSerializer()让我头疼,所以我解决了它。我将检查Entushiast Martin的答案作为一种解决方案,因为它们将我带到了实际答案。谢谢。

已解决。