Как сериализовать поля 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