Çağ*_*rın 5 django serialization django-rest-framework
我在 Django 1.9.1 中使用 Django Rest Framework 3.3.2 我有 2 个序列化程序,我在另一个序列化程序中使用其中一个。
class VideoSerializer(serializers.ModelSerializer):
current_username = serializers.SerializerMethodField()
is_deletable = serializers.SerializerMethodField()
tagged_users = EachUserSerializer(many=True, read_only=True)
print current_username
comments = CommentSerializer(many=True, read_only=True, context={'current_username': current_username})
place_taken = PlaceLimitedSerializer()
owner_user = EachUserSerializer()
class Meta:
model = Video
fields = ('tagged_users', 'comments', 'place_taken', 'video_id', 'video_url', 'like_count', 'caption', 'date',
'category', 'owner_user', 'current_username', 'is_deletable', )
def get_current_username(self, obj):
self.current_username = self.context['request'].user.username
return self.context['request'].user.username
def get_is_deletable(self, obj):
return obj.is_deletable_by(self.current_username)
class CommentSerializer(serializers.ModelSerializer):
current_username = serializers.SerializerMethodField()
is_deletable = serializers.SerializerMethodField()
is_editable = serializers.SerializerMethodField()
def get_current_username(self, obj):
self.current_username = self.context['current_username']
return self.current_username
def get_is_deletable(self, obj):
return obj.is_deletable(self.current_username)
def get_is_editable(self, obj):
return obj.is_editable(self.current_username)
class Meta:
model = Comment
fields = ('comment', 'username', 'comment_id', 'date', 'current_username', 'is_editable', 'is_deletable',)
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要在序列化程序中使用当前用户的用户名。我设法在 VideoSerializer 中通过在这样的视图中设置上下文来做到这一点。
class get_video(APIView):
def get(self, request):
video_id = str(request.query_params.get('video_id'))
if Video.objects.all().filter(video_id=video_id).exists():
video = Video.objects.get(video_id=video_id)
serializer = VideoSerializer(video, context={"request": request})
return JsonResponse(serializer.data)
else:
return JsonResponse({"result": "no_video"})
Run Code Online (Sandbox Code Playgroud)
在 VideoSerializer 中,我尝试设置上下文,并且想将“current_user”传递给 CommentSerializer,但它给出了此错误。
Internal Server Error: /video/get_video/
Traceback (most recent call last):
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/views.py", line 466, in dispatch
response = self.handle_exception(exc)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/views.py", line 463, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/mcagataybarin/molocate-dev/molocate_eb/video/views.py", line 96, in get
return JsonResponse(serializer.data)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/serializers.py", line 503, in data
ret = super(Serializer, self).data
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/serializers.py", line 239, in data
self._data = self.to_representation(self.instance)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/serializers.py", line 472, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/serializers.py", line 614, in to_representation
self.child.to_representation(item) for item in iterable
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/serializers.py", line 472, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/Users/mcagataybarin/molocate-dev/env/lib/python2.7/site-packages/rest_framework/fields.py", line 1645, in to_representation
return method(value)
File "/Users/mcagataybarin/molocate-dev/molocate_eb/video/serializers.py", line 13, in get_current_username
self.current_username = self.context['current_username']
KeyError: 'current_username'
Run Code Online (Sandbox Code Playgroud)
我该如何解决?我检查了 DRF 文档并检查了 stackoverflow,但找不到正确的答案。如果你能帮忙,我将不胜感激。
经过大量谷歌搜索后,我解决了这个问题。
class VideoSerializer(serializers.ModelSerializer):
current_username = serializers.SerializerMethodField()
is_deletable = serializers.SerializerMethodField()
tagged_users = EachUserSerializer(many=True, read_only=True)
comments = serializers.SerializerMethodField()
place_taken = PlaceLimitedSerializer()
owner_user = EachUserSerializer()
class Meta:
model = Video
field = ('tagged_users', 'comments', 'place_taken', 'video_id', 'video_url', 'like_count', 'caption', 'date',
'category', 'owner_user', 'is_deletable', )
def get_comments(self, obj):
serializer_context = {'current_username': self.current_username}
serializer = CommentSerializer(obj.comments, many=True, read_only=True, context=serializer_context)
return serializer.data
def get_current_username(self, obj):
self.current_username = self.context['request'].user.username
return self.context['request'].user.username
def get_is_deletable(self, obj):
return obj.is_deletable_by(self.current_username)
class CommentSerializer(serializers.ModelSerializer):
current_username = serializers.SerializerMethodField()
is_deletable = serializers.SerializerMethodField()
is_editable = serializers.SerializerMethodField()
def get_current_username(self, obj):
self.current_username = self.context.get('current_username')
return self.context.get('current_username')
def get_is_deletable(self, obj):
return obj.is_deletable(self.current_username)
def get_is_editable(self, obj):
return obj.is_editable(self.current_username)
class Meta:
model = Comment
fields = ('comment', 'username', 'comment_id', 'date', 'current_username', 'is_editable', 'is_deletable',)
Run Code Online (Sandbox Code Playgroud)
我在 SerializerMethodField 中序列化了嵌套序列化,并将从上下文中提取的 current_username 发送到了嵌套序列化器的上下文。完成此问题后解决并且有效:)
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |