如何在 Serializer 的 Validate 处获取 User?
How can I get User at Validate in Serializer?
在我的视图 (CreateView) 中,我重写了我的方法 def create,但是在我的验证中,我无法通过 self.context.get('request').user
获取登录用户,那么,我怎样才能让用户登录我的验证?
更新:
错误是:
line 293, in validate
user = self.context.get('request').user
AttributeError: 'NoneType' object has no attribute 'user'
更新 2
class OrderAPIPost(CreateAPIView):
permission_classes = (permissions.IsAuthenticated, )
serializer_class = MultipleOrderSerializer
queryset = Order.objects
def create(self, request, *args, **kwargs):
write_serializer = MultipleOrderSerializer(data=request.data)
write_serializer.is_valid(raise_exception=True)
orders = write_serializer.data.get('items')
orders = list(map(lambda order: Order.create_order(order, self.request.user), orders))
read_serializer = list(map(lambda order: OrderSerializerList(order), orders))
read_serializer = list(map(lambda order: order.data, read_serializer))
return Response(read_serializer, status=status.HTTP_201_CREATED)
因此,根据我在您的代码中看到的情况,您是在不添加上下文的情况下手动创建序列化程序。在大多数情况下,允许 CreateView
自己创建序列化器就足够了,但如果你真的需要自己创建它,那么你需要记住传递上下文。像这样的东西:
context = {'request': self.request}
write_serializer = MultipleOrderSerializer(data=request.data, context=context)
您可以检查视图的 get_serializer()
方法以了解如何正确创建序列化程序。我真的建议你重构你的代码并尝试使用现有的解决方案来创建序列化程序
在我的视图 (CreateView) 中,我重写了我的方法 def create,但是在我的验证中,我无法通过 self.context.get('request').user
获取登录用户,那么,我怎样才能让用户登录我的验证?
更新:
错误是:
line 293, in validate
user = self.context.get('request').user
AttributeError: 'NoneType' object has no attribute 'user'
更新 2
class OrderAPIPost(CreateAPIView):
permission_classes = (permissions.IsAuthenticated, )
serializer_class = MultipleOrderSerializer
queryset = Order.objects
def create(self, request, *args, **kwargs):
write_serializer = MultipleOrderSerializer(data=request.data)
write_serializer.is_valid(raise_exception=True)
orders = write_serializer.data.get('items')
orders = list(map(lambda order: Order.create_order(order, self.request.user), orders))
read_serializer = list(map(lambda order: OrderSerializerList(order), orders))
read_serializer = list(map(lambda order: order.data, read_serializer))
return Response(read_serializer, status=status.HTTP_201_CREATED)
因此,根据我在您的代码中看到的情况,您是在不添加上下文的情况下手动创建序列化程序。在大多数情况下,允许 CreateView
自己创建序列化器就足够了,但如果你真的需要自己创建它,那么你需要记住传递上下文。像这样的东西:
context = {'request': self.request}
write_serializer = MultipleOrderSerializer(data=request.data, context=context)
您可以检查视图的 get_serializer()
方法以了解如何正确创建序列化程序。我真的建议你重构你的代码并尝试使用现有的解决方案来创建序列化程序