2014-11-01 57 views
0

好吧,我知道如何指定字段(串行)是READ_ONLY或只寫這樣的:如何指定哪些字段在django rest框架中被認證和未認證的用戶序列化?

class CustomUserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = CustomUser 
     fields = ('url', 'username','email','password') 
     write_only_fields = ('password',) 

,我知道哪些HTTP方法所允許的身份驗證或未驗證用戶請求權限類implemenets。

但是,如果我想讓未經過身份驗證的用戶只能看到'用戶名',但通過身份驗證/登錄的用戶也可以看到電子郵件? (例如)

有沒有人有一個想法如何以模塊化的方式編程這樣的行爲,所以它可以適用於多個模型/序列化?

回答

1

如果您使用GenericAPIView或任何它的子類(這是很常見的),你可以簡單地覆蓋串行的__init__只留下選定字段:

class MySerializer(serializers.HyperlinkedModelSerializer): 
    def __init__(self, *args, **kwargs): 
     super(MySerializer, self).__init__(*args, **kwargs) 

     # GenericAPIView has an access to request object 
     request = self.context['request'] 
     if request.user.is_anonymous(): 
      field = self.fields['username'] 
      self.fields = {'username': field} 

當然,如果你打電話串行器直接,你需要pass the context yourself

+0

謝謝,這是能夠檢測到用戶是否或未經過身份驗證,但我無法創建字段參數。 如果我這樣定義它self.fields = ['用戶名'] python提高屬性錯誤「'列表'對象沒有屬性'項目'」 – 2014-11-02 10:54:02

+0

@MatúšBartko你可以嘗試更新的代碼? – mariodev 2014-11-02 11:27:04

+0

噢,它的工作原理!非常感謝你,我真的很感激:) – 2014-11-02 11:51:54

1

最好的辦法是有兩個不同的序列化器,一個用於認證用戶,另一個用於未經認證的用戶。然後,您可以通過覆蓋get_serializer_class來爲請求返回正確的序列化程序,從而控制使用哪個序列化程序。

您可以在方法中使用self.request訪問當前請求。

沒有簡單的模塊化方法來做到這一點,因爲確保傳入和傳出數據在不使用單獨序列化器的情況下仍然是安全的,這非常複雜。