我目前正在研究一個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框架,所以請如果原諒我答案很明顯。
感謝您的回答。但是,我必須在ModelViewSet上添加任何內容嗎? – chronox
如果上下文[「請求」上面不工作,那麼你應該重寫你的觀點,包括在串行上下文的請求,像這樣的:def get_serializer_context(個體經營): 返回{「請求」:self.request獲取} – ziiiro
再次感謝您的快速回復。但在添加答案後,我得到了一個KeyError「請求」,我仍然錯過了什麼? – chronox