[英]Django Rest framework - data between two serializers do not validate
I have a API view in place where I first want to create a new user (already working) and second I want to return the new created user object using my UserSerializer (Not working).我有一个 API 视图,我首先想创建一个新用户(已经工作),然后我想使用我的 UserSerializer(不工作)返回新创建的用户对象。
views.py视图.py
@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
exception_handler = UserUnavailable
success_handler = UserCreated
if request.method == 'POST':
creation_serializer = CreateUserSerializer(data=request.data)
try:
if creation_serializer.is_valid(raise_exception=True):
creation_serializer.save()
user_serializer = UserSerializer(data=creation_serializer.instance.id)
if user_serializer.is_valid():
return JsonResponse({"status_code": success_handler.status_code,
"default_detail": success_handler.default_detail,
"default_code": success_handler.default_code,
"new_user": user_serializer,
}, safe=False)
except APIException:
return JsonResponse({"status_code": exception_handler.status_code,
"default_detail": exception_handler.default_detail,
"default_code": exception_handler.default_code
}, safe=False)
I can confirm that creation_serializer.instance.id contains the new users id.我可以确认 creation_serializer.instance.id 包含新用户 ID。
serializers.py序列化程序.py
class UserSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
class Meta:
model = get_user_model()
fields = ('id', 'user')
read_only_fields = ('id', 'user')
I can also confirm that我也可以确认
if user_serializer.is_valid()
does not validate for some reason.由于某种原因没有验证。 Any ideas
有任何想法吗
Thanks in advance提前致谢
To initialize a serializer with user instance instead of使用用户实例而不是初始化序列化程序
user_serializer = UserSerializer(data=creation_serializer.instance.id)
You should write something like this:你应该这样写:
user_serializer = UserSerializer(instance=creation_serializer.instance)
instead of代替
Also, you don't have to validate the object that has already been saved.此外,您不必验证已保存的对象。 And create a response you should like this:
并创建一个你应该喜欢的回复:
return JsonResponse({
"status_code": success_handler.status_code,
"default_detail": success_handler.default_detail,
"default_code": success_handler.default_code,
"new_user": user_serializer.data,
}, safe=False)
But using api_view is now a bad thing.但是现在使用 api_view 是一件坏事。 It's much better to use ModelViewSet.
使用 ModelViewSet 会好很多。 You can use something like this:
你可以使用这样的东西:
class UserViewSet(ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
def get_serializer_class(self, *args, **kwargs):
if self.action == 'create':
return CreateUserSerializer
return super().get_serializer_class(*args, **kwargs)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
response_serializer = self.serializer_class(instance=serializer.instance)
return Response(response_serializer.data, status=status.HTTP_201_CREATED, headers=headers)
And I'm sorry, I haven't tested it, there might be typos.对不起,我没有测试过,可能有错别字。 You can read about ModelViewsets more here https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset
您可以在此处阅读有关 ModelViewsets 的更多信息https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.