如何在Django REST框架mongoengine的投入的基础上添加附加字段

问题描述:

我正在开发一个API,使用django-rest-framework-mongoengineMongoDb,我想追加其他字段从serializer用户输入的基础上的要求,例如如果用户输入keyword = @rohit49khatri,我想通过操纵keyword,像type = usernameusername = 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) 
+0

是否有可能做到这一点。在验证后的'serializer'中? –

+0

@RohitKhatri情况1(恕我直言,你的情况,perform_create可以处理它)是验证后,由一个....我会更新的答案添加的情况为了.... – soooooot

+0

谢谢,它解决了我的问题:-) –