在Django-rest框架mongoengin中如何在输入的基础上添加额外的字段

2024-09-29 21:50:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个API,使用django-rest-framework-mongoengineMongoDb,我想在用户输入的基础上向来自{}的请求追加额外的字段,例如,如果用户输入keyword=@rohit49khatri,我想通过操作keyword,比如{}=usernameusername=rohit49khatri

我的代码是:

class SocialFeedCreateSerializer(DocumentSerializer):
    type = 'username'

    class Meta:
        model = SocialFeedSearchTerm
        fields = [
            'keyword',
            'type',
        ]
        read_only_fields = [
            'type'
        ]

查看

^{pr2}$

但是当我打印type参数时,它给出None

请帮我省点时间。谢谢。在


Tags: django代码用户restapifieldsmongodbtype
1条回答
网友
1楼 · 发布于 2024-09-29 21:50:03

对于附加的问题:如何获取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可以处理:

^{pr2}$

情况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)

相关问题 更多 >

    热门问题