我遇到一个只读属性未按预期运行的问题。我看过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/