Подтвердить что ты не робот

ModelSerializer с использованием свойства модели

Я пытаюсь сериализовать модель, содержащую поле свойств, которое я также хочу сериализовать.

models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

При попытке перейти к связанному URL-адресу я получаю исключение serializer (KeyError) в свойстве ext_link.

Как я могу сериализовать свойство ext_link?

4b9b3361

Ответ 1

Поскольку это не поле модели, оно должно быть явно добавлено к классу сериализатора

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

Изменить: В REST framework 3 добавление в fields будет просто работать - не нужно явно добавлять поле.

Ответ 2

как комментирует @Robert Townley, эта работа с версией 3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"