How to serialize the return value of a method in a model?

Question:

I have a Django app that uses Django REST Framework and Django-allauth. Now, I’m trying to retrieve the avatar URL that’s present in the social account. However, I’m having trouble forming the serializer.

For background info, the allauth‘s SocialAccount is related to the user model via a foreign key:

class SocialAccount(models.Model):
    user = models.ForeignKey(allauth.app_settings.USER_MODEL)


    # the method I'm interested of
    def get_avatar_url(self):
        ...

Now, here’s the serializer I currently have:

class ProfileInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name')

In the end, I’d like to have an extra field avatar_url which takes the result of the method call in the SocialAccount model. How do I do that?

Asked By: manabreak

||

Answers:

I found a solution using a SerializerMethodField:

class ProfileInfoSerializer(serializers.ModelSerializer):
    avatar_url = serializers.SerializerMethodField()

    def get_avatar_url(obj, self):
        return obj.socialaccount_set.first().get_avatar_id()

    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'avatar_url')
Answered By: manabreak

**UPDATE **

def get_avatar_url(self, obj):

Answered By: Peter KovalĨík