django - Rest Framework 序列化程序字段只读不起作用

标签 django serialization django-rest-framework

我遇到一个只读属性未按预期运行的问题。我看过this question和其他来源尝试解决问题,但无济于事。

端点用于保存和列出用户收藏夹。用户可以收藏多种对象类型,因此我使用了内容类型框架。

# serializers.py
class FavouriteSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    type = serializers.CharField(source='content_type', read_only=True)
    object = FavouriteObjectRelatedField(read_only=True)
    content_type = serializers.CharField(write_only=True)
    object_id = serializers.IntegerField(write_only=True)

    def create(self, validated_data, *args, **kwargs):
        content_object = Favourites.objects.get_content_object(validated_data.get('object_id'),
                                                               validated_data.get('content_type'))
        user = kwargs.get('user')
        return Favourites.objects.create_favourite(content_object, user)

    class Meta:
        model = Favourites
        fields = ('type', 'object','user','content_type','object_id')

这是根据对象的类型动态序列化对象所需的 FavouriteObjectRelatedField 序列化程序。

# serializers.py
class FavouriteObjectRelatedField(serializers.RelatedField):
    """
    A custom serializer to use for favourited objects.
    """
    def to_representation(self, value):
        """
        Serialize favourited objects using their respective serializer
        """
        if isinstance(value, Track):
            track = TrackBuilder(value).get_info()
            serializer = TrackSerializer(track, context=self.context, read_only=True)

        elif isinstance(value, News):
            serializer = NewsSerializer(value, context=self.context, read_only=True)

        else:
            raise Exception("Unexpected type of favourited object")

        return serializer.data

还有风景。我覆盖了 perform_create 方法,以便添加从 url 参数检索的用户实例。

#views.py
class UserFavouritesList(generics.ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
    serializer_class = FavouriteSerializer

    def get_user(self):
        user_id = self.kwargs.get('user_id')
        try:
            return get_user_model().objects.get(pk=user_id)
        except get_user_model().DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

    def perform_create(self, serializer):
        serializer.save(user=self.get_user())

    def get_queryset(self):
        return Favourites.objects.user_favourites(self.get_user())

我总是收到需要用户字段的错误。但是,如果我删除了 user 字段,这个错误显然就消失了。有趣的是,如果我将 user 字段重命名为 owner,我仍然会遇到相同的错误,字段名称指定为 user。此处错误:

{
    "user": [
        "This field is required."
    ]
}

更新1

对于其中一个答案,我已经尝试设置 required=True 但它没有效果。

删除 read_only=True 不是一个选项,因为不应从该端点编辑用户实例。

更新2

另一个有趣的发展:如果我删除 type 字段,它会按预期工作。奇怪但不知何故访问 content_type 字段必须对验证有影响。

最佳答案

尝试在其中设置 required=False,而不是 read_only=True

user = UserSerializer(required=False)

关于django - Rest Framework 序列化程序字段只读不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38486590/

相关文章:

python - django - 夹层 - 静态文件 - 令人沮丧的错误

python - 如何在 django 查询集中 AND 链接过滤器?

表单集上的 Django 自定义验证

django-rest-framework - django rest 框架中的 @link 装饰器作为列表 Controller

json - 如何更改 RESTful API 的 URL 上的搜索键?

jquery - 无法使用 Google Search Console 抓取我的新网站

django - 如何在 Django 应用程序中访问 PostgreSQL 数据库

c - 我正在寻找一种高效的 C 对象序列化机制

python cPickle不保存类列表

c# - 如何在 Unity3D 中保存自定义变量?