Python Django Rest Api过滤器字段基于request.user的选择选项

Python Django Rest Api过滤器字段基于request.user的选择选项,python,django,django-rest-framework,Python,Django,Django Rest Framework,我目前正在开发一个django rest框架api,其中包括显示活动列表并允许用户创建新的活动 在可浏览的api上,我设法显示了我想要的活动列表,并为用户创建了一个新活动的表单 这是用户用于创建新活动的表单的屏幕截图 虽然一切正常,但我遇到了一个问题,即使在阅读了文档之后,我也不知道如何解决这个问题 正如您在屏幕截图上看到的,有一个clist字段,允许用户选择他/她希望向其发送活动邀请的联系人列表。但是,我想确保当前该字段中仅显示用户公司创建的联系人列表,可以选择来自不同公司的所有联系人列表 以

我目前正在开发一个django rest框架api,其中包括显示活动列表并允许用户创建新的活动

在可浏览的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框架还是相当陌生的,所以如果答案很明显,请原谅。

不确定您的模型是什么样子,但类似这样的东西可以工作:

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))
我删除了get_serializer_上下文,并将代码更新为该上下文

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

现在,请求被传递给序列化程序。

谢谢您的回答。但是我必须在ModelViewSet上添加任何内容吗?如果上面的上下文[request]不起作用,那么您应该重写您的视图,将请求包含在序列化程序上下文中,如下所示:def get_serializer_contextself:return{'request':self.request}再次感谢您的快速回复。但是,在添加您的答案后,我收到了一个KeyError“request”,我是否仍然缺少一些内容?我编辑了答案,您是否更新了视图,获取了_serializer_context以返回请求是的,我已经这样做了。添加get_序列化程序_上下文后,我仍然收到错误