2016-07-09 24 views
5
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_classespermission_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) 
+0

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ì? –

+0

@Bob: đã thêm mã lượt xem trong chi tiết câu hỏi, plz có giao diện. – Wendy

+0

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, ...})'. –

Trả lời

11

Làm thế nào để bạn tạo serializer trong phương pháp của viewset bạn list()? Bạn nên gọi

serializer = self.get_serializer(data=request.data) 

để có được bối cảnh serializer bạn điền tự động khi nó được thực hiện trong default implementation of this method in DRF mixins, nhưng tôi có một cảm giác rằng bạn chỉ cần tạo ra nó bằng tay, như thế này:.

serializer = MyModelSerializer(instance) 

Vì vậy, , để sửa lỗi này, bạn nên gọi hoặc get_serializer(), hoặc vượt qua thêm tham số ngữ cảnh để serializer constructor:

serializer = MyModelSerializer(instance, context={'request': request, ...}) 
+0

Cảm ơn! đề xuất của bạn đã hoạt động :) – Wendy

+0

@Wendy Tuyệt vời! Chúc may mắn. –

Các vấn đề liên quan