在我们开发的时候,我么使用序列化器序列化返回的时候,返回的大多都是数据框中一个表中的字段,但是我们还想返回一些其他表(关联表)中的字段数据怎么办,或者说根据字段数据(true flase)来返回别的数据,此时怎么办哪,drf框架已经帮我们想好了,他就是serializerMethodField,具体怎么做哪,我们可以看代码
class MessageListSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(read_only=True)
created_at = serializers.DateTimeField(read_only=True)
is_read = serializers.SerializerMethodField()
def get_is_read(self, instance):
# return '已读' if instance['is_read'] else '未读'
return '已读' if instance.is_read else '未读'
class Meta:
model = Message
# fields = ('id', 'title', 'created_at', 'is_read')
fields = ('id', 'title', 'created_at', 'is_read')``
```python
标准写法就是get_名字,instance表示的是此时你model中的对象,可以根据此对象来查询关联的数据库中字段的数据,
另外一个例子:
class RoleModelSerializer(serializers.ModelSerializer):
"""角色模型序列化器"""
user_count = serializers.SerializerMethodField(label='用户数量') # 新增数据库不存在字段用户数量
class Meta:
model = Role
fields = ['id', 'name', 'desc', 'user_count']
def get_user_count(self, obj):
"""
返回当前角色用户数量
固定写法,obj代表Role实例对象,模型类配置了反向引用user代表当前角色用户
"""
number = obj.user.count()
return number``