class MyModelSerializer(serializers.ModelSerializer):
field1 = serializers.CharField()
field2 = serializers.SerializerMethodField('get_awesome_user')
def get_current_user(self):
request = self.context.get("request")
if request and hasattr(request, "user"):
return request.user
return None
def get_awesome_user(self, obj):
user = self.get_current_user()
## use this user object, do some stuff and return the value
return ...
My api (trong đó sử dụng authentication_classes
và permission_classes
) đang sử dụng serializer này và get_current_user
hàm luôn trả về None
. khi tôi gỡ lỗi, tôi thấy rằng self.context là từ điển trống, tức là {}
. để chắc chắn tôi cũng đã in self.context.keys()
, vẫn là danh sách trống.Django còn lại khuôn khổ - self.context không có yêu cầu thuộc tính
Tôi đã theo chủ đề này.
Get current user in Model Serializer
PS: Tôi đang sử dụng djangorestframework==3.3.3
, Django==1.9.1
EDIT: thêm mã viewset
class MyModelViewSet(viewsets.ModelViewSet):
authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
permission_classes = (IsAuthenticated,)
def list(self, *args, **kwargs):
queryset = MyModel.objects.all()
page = self.paginate_queryset(queryset)
if page is not None:
serializer = MyModelSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = MyModelSerializer(queryset, many=True)
return Response(serializer.data)
Thông thường, self.context được điền bởi 'generics.py:GenericApiVie Hàm w.get_serializer_context() ', được gọi bởi' generics.py:GenericApiView.get_serializer() ', lần lượt được gọi trong phần đầu của' viewset.list()/detail()/create()/delete ()/update() 'trong' mixins.py'. Bạn có thể cung cấp mã ViewSet của bạn, vì nó là cần thiết để hiểu những gì bạn đang cố gắng để làm gì? –
@Bob: đã thêm mã lượt xem trong chi tiết câu hỏi, plz có giao diện. – Wendy
Xin lỗi vì sự chậm trễ. Wendy, '#some stuff' không giải thích nhiều. Làm thế nào để bạn tạo serializer trong phương thức 'list()' của viewset của bạn? Bạn nên gọi 'serializer = self.get_serializer (data = request.data)' để có được bối cảnh serializer của bạn được điền tự động, nhưng tôi có cảm giác rằng bạn đang tạo nó theo cách thủ công, như 'serializer = MyModelSerializer (instance)'. Bạn nên gọi 'get_serializer()', hoặc chuyển đối số ngữ cảnh bổ sung cho hàm tạo nối tiếp: 'serializer = MyModelSerializer (instance, context = {'request': request, ...})'. –