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?
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')
**UPDATE **
…
def get_avatar_url(self, obj):
…
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?
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')
**UPDATE **
…
def get_avatar_url(self, obj):
…