#django #django-rest-framework
Вопрос:
У меня есть следующие два представления в моем django api views.py:
@api_view(['GET',])
@authentication_classes([JSONWebTokenAuthentication])
@permission_classes([AllowAny])
def user(request):
if request.method == 'GET':
serializer = UserSerializer(request.user)
return JsonResponse(serializer.data, safe=False)
@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
exception_handler = UserUnavailable
success_handler = UserCreated
if request.method == 'POST':
serializer = CreateUserSerializer(data=request.data)
try:
if serializer.is_valid(raise_exception=True):
serializer.save()
return JsonResponse({"status_code": success_handler.status_code,
"default_detail": success_handler.default_detail,
"default_code": success_handler.default_code,
"user_object": UserSerializer(serializer.instance)
}, 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)
serializers.py
class UserSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
class Meta:
model = get_user_model()
fields = ('id', 'user', 'avatar_url', 'avatar_tn_url')
read_only_fields = ('id', 'user')
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('user', 'password')
extra_kwargs = {'password': {'write_only': True}} # We dont want to show the hashed password
def create(self, data):
password = data.pop('password')
user = User.objects.create_user(
data['user'],
)
user.set_password(password)
user.save()
return user
Что я хочу сделать, так это то, что после создания пользователя я хотел бы показать объект user в ответе API, поэтому у меня есть UserSerializer(сериализатор.экземпляр), но, похоже, это утверждение просто неверно. Кто-нибудь может помочь?
Ответ №1:
Попробуйте создать экземпляр UserSerializer
amp; вызвать метод is_valid (). Вы можете вызвать .data
свойство, чтобы сериализовать User
экземпляр.
Взгляните на обновленный код:
@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
exception_handler = UserUnavailable
success_handler = UserCreated
if request.method == 'POST':
serializer = CreateUserSerializer(data=request.data)
user_serializer = UserSerializer(serializer.instance)
try:
if serializer.is_valid(raise_exception=True) and user_serializer.is_valid(raise_exception=True):
serializer.save()
return JsonResponse({"status_code": success_handler.status_code,
"default_detail": success_handler.default_detail,
"default_code": success_handler.default_code,
"user_object": user_serializer.data
}, 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)
Комментарии:
1. По какой-то причине print(serializer.instance) не возвращает ничего, есть идеи?