2017-07-25 59 views
0

我目前正在研究一個django rest框架api,它涉及顯示活動列表並允許用戶創建新的活動。基於request.user的Django Rest Api過濾字段的選擇選項用戶

在可瀏覽的api上,我設法顯示了我想要的活動列表以及用戶創建新活動的表單。

這是用戶用於創建新廣告系列的表單的屏幕截圖。

A screenshot of the form on browsable API

雖然一切工作,我面對的是,我沒有任何想法如何閱讀文檔後甚至解決的問題。

正如你可以在截圖中看到,有一個CLIST字段,它允許用戶選擇聯繫人列表中,他/她要競選邀請被髮送到。但是,我想確保只有用戶公司創建的聯繫人列表顯示在該字段中(目前,可以選擇不同公司的所有聯繫人列表)。

這裏是在api.py代碼:

class EditCampaignViewSet(ModelViewSet): 
    queryset = Campaign.objects.all() 
    serializer_class = EditCampaignSerializer 
    parser_classes = (MultiPartParser, FormParser) 

    def get_serializer_context(self): 
     return {'request': self.request} 

    def list(self, request, p_uuid=None, type=None, *args, **kwargs): 
     company = request.user.profile.company 
     queryset = Campaign.objects.filter(company=company, 
              product__uuid=p_uuid, 
              deleted=False, 
              campaign_type=type)\ 
            .order_by('-created')\ 
            .prefetch_related('user__profile') 
     serializer = EditCampaignSerializer(queryset, many=True) 
     return Response(serializer.data) 

這是serializers.py

class EditCampaignSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Campaign 
     fields = ('id', 'campaign_id', 'campaign_type', 'name', 'product', 'description', 'status', 'actual_file_name', 
       'pdf_file', 'download', 'header', 'body', 'footer', 'company', 'created', 'updated', 'deleted', 
       'clist', 'user') 
     read_only_fields = ('id', 'campaign_id', 'campaign_type', 'product', 'status', 'actual_file_name', 'company', 'created', 
         'updated', 'deleted', 'user') 

    def __init__(self, *args, **kwargs): 
     super(EditCampaignSerializer, self).__init__(*args, **kwargs) 
     user = self.context['request'].user 
     self.fields['clist'] = ChoiceField(choices=CList.objects.filter(company=user.profile.company)) 

我仍然很新的Django的REST框架,所以請如果原諒我答案很明顯。

回答

0

我刪除了get_serializer_context和而是更新我的代碼。

serializer = EditCampaignSerializer(queryset, many=True, context={'request': self.request}) 

現在,請求被傳遞給串行器。

0

不知道你的模型是什麼樣子,但像這樣將工作:

views.py:

class EditCampaignViewSet(ModelViewSet): 
    ... 

    def get_serializer_context(self): 
     return {'request': self.request} 

serializers.py:

class EditCampaignSerializer(serializers.ModelSerializer): 

    class Meta: 
     ... 
     ... 

    def __init__(self, *args, **kwargs): 
     super(EditCampaignSerializer, self).__init__(*args, **kwargs) 
     user = self.context['request'].user 
     self.fields['clist'] = ChoiceField(choices=ContactList.objects.filter(company__user=user)) 
+0

感謝您的回答。但是,我必須在ModelViewSet上添加任何內容嗎? – chronox

+0

如果上下文[「請求」上面不工作,那麼你應該重寫你的觀點,包括在串行上下文的請求,像這樣的:def get_serializer_context(個體經營): 返回{「請求」:self.request獲取} – ziiiro

+0

再次感謝您的快速回復。但在添加答案後,我得到了一個KeyError「請求」,我仍然錯過了什麼? – chronox