我目前正在开发一个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休息框架的新手,所以如果答案显而易见,请原谅我。
答案 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})
现在,请求被传递给序列化程序。