Как сериализовать поля Cloudinary?

Я пытаюсь использовать Cloudinary SDK для Svelte и Django. У меня есть модель с CloudinaryField:

class Room(models.Model):
    ...
    avatar = CloudinaryField("image")

class UserRoom(models.Model):
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    ...

и сериализатор для UserRoom:

class UserRoomSerializer(ModelSerializer):
    user = UserSerializer()
    last_message = SerializerMethodField()

    def get_last_message(self, obj):
        return MessageSerializer(obj.room.message_set.first()).data

    class Meta:
        model = UserRoom
        fields = "__all__"
        depth = 1

Я хочу использовать компонент Cloudinary's svelte <CldImage /> и мне нужно передать в него публичный id изображения. Но когда я делаю запрос, я получаю путь к изображению, а не id:

{
  "id": 1,
  "user": {
    ...
  },
  "last_message": {
    ...
  },
  "unread_messages": 0,
  "room": {
    "id": "49c33134-cc9f-43e0-b524-b05e9387602d",
    "name": "test",
    "avatar": "image/upload/v1728304120/sz8h5f5oqbtc95cfxbvx.jpg" // THIS LINE IS A PATH, NOT AN ID
  }
}

Как заставить DRF отправлять идентификатор, а не путь?

The reason this happens is because a CloudinaryField has no dedicated field for the Django REST framework (DRF) [drf-doc]. That means it will try to call the .value_to_string(…) method [GitHub] of the corresponding field, which returns the path.

Однако мы можем определить пользовательский сериализатор, который будет принимать .public_id из CloudinaryResource:

class RoomSerializer(ModelSerializer):
    avatar = models.CharField(source='avatar.public_id', read_only=True)

    class Meta:
        model = Room
        fields = '__all__'


class UserRoomSerializer(ModelSerializer):
    user = UserSerializer()
    last_message = SerializerMethodField()
    room = RoomSerializer()

    def get_last_message(self, obj):
        return MessageSerializer(obj.room.message_set.first()).data

    class Meta:
        model = UserRoom
        fields = '__all__'
        depth = 1
Вернуться на верх