ModelSerializer using model property

I'm trying to serialize a model containing a property field that I also want to serialize.

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')

When trying to get to the related URL, I'm getting a serializer exception (KeyError) on the ext_link property.

How can I serialize the ext_link property?


Because it's not a model field, it needs to be added explicitly to the serializer class

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

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

as @Robert Townley's comment, this work with version 3.8.2:

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

    class Meta:
        model = MyModel
        fields = "__all__"

The accepted answer doesn't seem to work for me, nor does the ReadOnlyField.

However, I have had success when I use a field that corresponds to the return type of my property function.

So for the example, I would do this:

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

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

I've been able to do this with ListField, DictField, and IntegerField as well.