首先,SerializerMethodField的使用非常简单
class CommentSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField('get_user_name')
class Meta:
model = Comment
fields = ('name', 'create_time', 'text')
def get_user_name(self, obj):
return obj.author.nickname
如上图,obj是对应的模型,此处是Comment。author是Comment的ForeignKeyField,nickName是Author的一个字段。
到此为止非常简单,但如果我有一个manytomany的字段该怎么办?譬如:
class Post(models.Model):
like = models.ManyToManyField(User, related_name='likes', blank=True)
一个博客可能被多个用户点赞,而一个用户也可以点赞多个博客。此时,如果还是照搬前面的代码,在PostSerializer中写成
def get_who_like_it(self, obj):
return obj.like.nickname
就会产生错误,错误原因是Obj.like是一个ManyRelatedManager。那么把代码改成这样子即可:
def get_who_like_it(self, obj):
return [author.nickname for author in obj.like.all()]
文档中(针对类似的情况)提供了更多解决方案。https://www.django-rest-framework.org/api-guide/relations/#serializer-relations