Django - конечная точка POST для обновления нескольких таблиц. Возвращайте ответ со всеми необходимыми данными

У меня есть конечная точка POST, которая создает пост. Когда создается пост, запрос может сопровождаться видео и изображениями. Как вы можете видеть ниже, сериализатор обрабатывает данные поста вне изображений и видео, потому что мне нужно выполнить валидацию изображений и видео. Ответ возвращает сериализованные данные, но только все, что не относится к изображениям и видео. Я бы хотел, чтобы ответ также возвращал такие данные, как url изображения и видео, uuid. Как я могу сделать это с помощью недавно созданного post_obj?

view.py

@api_view(['POST'])
def POST_create_post(request):
    serializer = PostSerializer(data=request.data)
    if serializer.is_valid():
        try:
            post_obj = serializer.save()

            try:
                if 'images' in request.FILES.keys():
                    for img in request.FILES.getlist('images'):
                        validate_image_upload(img)
                        Photo.objects.create(post=post_obj, image=img)

                if 'video' in request.FILES.keys():
                    vid = request.FILES.get('video')
                    validate_video_upload(vid)
                    Video.objects.create(post=post_obj, video=vid)
            except ValidationError as e:
                return Response(dict(error=e,
                                     user_message=error_message_generic),
                                status=status.HTTP_400_BAD_REQUEST)

        except django.db.utils.InternalError as e:
            return Response(dict(error=serializer.errors,
                                 user_message=error_message_generic),
                            status=status.HTTP_400_BAD_REQUEST)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(dict(error=serializer.errors,
                             user_message=error_message_generic),
                        status=status.HTTP_400_BAD_REQUEST)

serializer.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('creator', 'body', 'uuid', 'created', 'updated_at')

models.py

class Photo(AbstractBaseModel):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=images_directory_path)

    @property
    def image_url(self):
        return self.image.url


class Video(AbstractBaseModel):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    video = models.FileField(upload_to=videos_directory_path)

    @property
    def video_url(self):
        return self.video.url

Для этого можно использовать SerializerMethodField. которое будет полем только для чтения.

например, в вашем случае:-

class PostSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField()
    class Meta:
        model = Post
        fields = ('creator', 'body', 'uuid', 'created', 'updated_at' , 'image_url')
    def get_image_url(self , obj):
        # obj is Post object
        # return image_url here

Дайте мне знать, если это сработает для вас.

Вернуться на верх