Вы можете разделить сериализатор Create и Retrieve.Например, создатель сериализатора будет тем, который вы используете в данный момент:
class DemoCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Demo
fields = '__all__'
С другой стороны, Retrieve сериализатор выполнит сериализацию пользователя с другим сериализатором, используя Nested Relationship .
class DemoRetrieveSerializer(serializers.ModelSerializer):
user = UserMinimalSerializer # or you could use your UserSerializer, see the last part of the answer
class Meta:
model = Demo
fields = ('id', 'name', 'desc', 'user')
read_only = ('id', 'name', 'desc', 'user',)
По вашему мнению, вы создадите данные с первым сериализатором и ответите вторым.Пример, использующий APIView
:
class DemoView(APIView):
def post(self, request, format=None):
create_serializer = DemoCreateSerializer(data=request.data)
if create_serializer.is_valid():
instance = create_serializer.save()
retrive_serializer = DemoRetrieveSerializer(instance)
return Response(retrive_serializer.data, status=status.HTTP_201_CREATED)
return Response(create_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Для достижения этого может потребоваться настройка представлений DRF, т. Е. Для Общих представлений .
Поскольку вы этого не делаетеЕсли вы хотите включить все поля модели User, вам придется написать минимальное представление User с использованием другого сериализатора.
class UserMinimalSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'first_name', 'last_name', 'email')
read_only = ('id', 'first_name', 'last_name', 'email',)
Надеюсь, это поможет.