请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问老师如何将请求中的一些信息写入serializer?

可能我说的并不准确,比如我在用户注册的时候,需要记录用户注册的IP地址或者浏览器信息,这些信息是来源于请求的META中,我现在的做法是这样的:

在UserProfileViewSet中重写create方法,然后把request.META['REMOTE_ADDR']插入serializer的validated_data中,然后再执行perform_create(serializer)方法,现在可以实现将ip地址插入到数据库对映字段中,可是我自己感觉这种实现很奇怪,因为这个IP地址无法经过serializer校验的那一层。请问老师如何做?多谢

我现在的代码差不多是这样的:

class UserProfileViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):

.......


def create(self, request, *args, **kwargs):
   serializer = self.get_serializer(data=request.data)
   serializer.is_valid(raise_exception=True)
   serializer.validated_data["add_ip"] = request.META['REMOTE_ADDR']
   user = self.perform_create(serializer)

def perform_create(self, serializer):
   return serializer.save()

......


请老师指点。我这种实现很奇怪,正常的这种来源于request中的信息应该在什么地方插入数据库,同时能享受到serializer的校验功能。

正在回答 回答被采纳积分+3

1回答

bobby 2017-10-07 15:45:30

这个可以重写create方法直接把这两个值放到request.data中然后传递给serializer进行序列化啊

0 回复 有任何疑惑可以回复我~
  • 提问者 天真男 #1
    不行吧?request.data是不可更改的吧?
        def create(self, request, *args, **kwargs):
            request.data["add_ip"] = request.META['REMOTE_ADDR']
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            .............
    
      File "/Users/skyrealman/python/virtualenv/django_py3/lib/python3.5/site-packages/django/http/request.py", line 431, in _assert_mutable
        raise AttributeError("This QueryDict instance is immutable")
    AttributeError: This QueryDict instance is immutable
    回复 有任何疑惑可以回复我~ 2017-10-07 16:22:21
  • bobby 回复 提问者 天真男 #2
    这个简单 你直接用deepcopy将request.data做一个深度拷贝就可以修改你深度拷贝出来的变量了
    回复 有任何疑惑可以回复我~ 2017-10-09 09:52:56
  • 提问者 天真男 回复 bobby #3
    嗯我是这么做的。我主要是想问一下老师,我需要将浏览器信息和访问ip插入数据库是不是在这里做?还是应该在前端通过js去获取,然后后端api上直接有这两个字段插入就行。我想要了解的是一般大型网站这种获取请求中的信息应该在前端做还是后端做。
    回复 有任何疑惑可以回复我~ 2017-10-09 09:59:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信