Django Rest Api过滤器字段根据request.user

时间:2017-07-25 07:43:50

标签: python django django-rest-framework

我目前正在开发一个django rest framework 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休息框架的新手,所以如果答案显而易见,请原谅我。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

我删除了get_serializer_context,而是将我的代码更新为此。

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

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