如何在Django REST框架mongoengine的投入的基础上添加附加字段
问题描述:
我正在开发一个API
,使用django-rest-framework-mongoengine
与MongoDb
,我想追加其他字段从serializer
用户输入的基础上的要求,例如如果用户输入keyword
= @rohit49khatri
,我想通过操纵keyword
,像type
= username
,username
= rohit49khatri
如何在Django REST框架mongoengine的投入的基础上添加附加字段
这里两个字段请求追加是我的代码:
串行
class SocialFeedCreateSerializer(DocumentSerializer):
type = 'username'
class Meta:
model = SocialFeedSearchTerm
fields = [
'keyword',
'type',
]
read_only_fields = [
'type'
]
查看
class SocialFeedCreateAPIView(CreateAPIView):
queryset = SocialFeed.objects.all()
serializer_class = SocialFeedCreateSerializer
def perform_create(self, serializer):
print(self.request.POST.get('type'))
但是当我打印type
参数,它给None
请帮我节省一些时间。谢谢。
答
了另一个问题:如何让type
参数?
# access it via `django rest framework request`
self.request.data.get('type', None)
# or via `django request`
self.request.request.POST.get('type', None)
为原题:
情况1)恕我直言,你的情况,perform_create
可以处理它:
def perform_create(self, serializer):
foo = self.request.data.get('foo', None)
bar = extract_bar_from_foo(foo)
serializer.save(
additional_foo='abc',
additional_bar=bar,
)
情况2)如果您需要操纵它之前的数据去串行器(以便被操纵的数据将通过串行验证):
class SocialFeedCreateAPIView(CreateAPIView):
queryset = SocialFeed.objects.all()
serializer_class = SocialFeedCreateSerializer
def create(self, request, *args, **kwargs):
# you can check the original snipeet in rest_framework/mixin
# original: serializer = self.get_serializer(data=request.data)
request_data = self.get_create_data() if hasattr(self, 'get_create_data') else request.data
serializer = self.get_serializer(data=request_data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def get_create_data(self):
data = self.request.data.copy()
# manipulte your data
data['foo'] = 'foo'
return data
情况3)如果你确实需要操纵请求: (这里只是一个例子,你可以尝试找出另一个地方操作要求)
class SocialFeedCreateAPIView(CreateAPIView):
queryset = SocialFeed.objects.all()
serializer_class = SocialFeedCreateSerializer
def initial(self, request, *args, **kwargs):
# or any other condition you want
if self.request.method.lower() == 'post':
data = self.request.data
# manipulate it
data['foo'] = 'foo'
request._request.POST = data
return super(SocialFeedCreateAPIView, self).initial(request, *args, **kwargs)
是否有可能做到这一点。在验证后的'serializer'中? –
@RohitKhatri情况1(恕我直言,你的情况,perform_create可以处理它)是验证后,由一个....我会更新的答案添加的情况为了.... – soooooot
谢谢,它解决了我的问题:-) –