Вернуть вложенный сериализатор при обновлении - PullRequest
0 голосов
/ 29 января 2019

У меня есть вложенный сериализатор в Django Rest Framework:

class AlbumSerializer(serializers.Serializer):
    title = serializers.CharField()
    tracks = TrackSerializer(many=True)

    def update(self, instance, validated_data):
        instance.title = validated_data.get(
            'title', instance.title)
        instance.save()
        return instance

Когда я получаю, я вижу:

{
  "title": "some title",
  "tracks": [
    {
      "name": "some track"
    }
  ]
}

Когда я использую обновление, я возвращаю обновленный альбом, минус треки - я бы хотел видеть треки в ответе 201. ПРИМЕЧАНИЕ : Я не хочу, чтобы вложенные элементы были доступны для записи, я просто хочу иметь возможность обновить родительский элемент и видеть существующие вложенные элементы в ответе.

ОБНОВЛЕНИЕ:

Вот мой взгляд. ПРИМЕЧАНИЕ: Для каждого пользователя будет только один альбом, поэтому некоторые из моего кода просмотра проверяют, существует ли пользователь, и соответственно создают или обновляют:

class AlbumView(APIView):
    serializer_class = AlbumSerializer

    def get_object(self, user):
        try:
            return Album.objects.get(user=user)
        except Album.DoesNotExist:
            return False

    def get(self, request, format=None):
        req = self.get_object(user=request.user)
        if req:
            serializer = AlbumSerializer(req)
            return Response(serializer.data)
        return Response("No album found")

    def post(self, request, format=None):
        req = self.get_object(user=request.user)
        serializer = AlbumSerializer(data=request.data)
        if serializer.is_valid(raise_exception=ValueError):
            if req:
                serializer.update(instance=req, validated_data=request.data)
            else:
                serializer.create(user=request.user, validated_data=request.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
...