首页 > 解决方案 > DRF 只读字段仍然有效

问题描述

我有一个我希望始终成为用户的领域。我的序列化器是这样的:

class MySerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = '__all__'
        read_only_fields = ('user',)

    def perform_save(self, serializer):
        serializer.save(user=self.request.user)

class MyModel(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ...

但它给了我错误NOT NULL constraint failed: app_my_model.user_id,但该字段是只读的......我不明白。

标签: pythondjangodjango-rest-framework

解决方案


首先,没有perform_save()为序列化程序命名的方法,它是为viewset类命名的。这可能是问题
使用如下save()方法

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
        read_only_fields = ('user',)

    def save(self, **kwargs):
        kwargs['user'] = self.context['request'].user
        return super().save(**kwargs)

推荐阅读