表中的字段有时候是不能满足我们实际需要的,所以大多情况下我们需要 加工从数据库中获取到的字段,以及扩展更多的字段
。也可能获取别的表的字段进行数据加工生成新字段,响应给前端让它做数据渲染。下面是对字段处理的几种方式:
1. 别名字段
这种是最简单的,返回给客户端的字段和原字段的字段名不同,但是 值相同
:
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=5, error_messages={'max_length': '字段太长!'})
alias = serializers.CharField(source='name') # 注意这里source='name'
class Meta:
model = models.User
fields = ('name', 'alias')
class User(views.APIView):
def get(self, request):
qs = models.User.objects.all()
serializer = UserSerializer(qs, many=True)
return response.Response({
'status': 0,
'data': serializer.data
})
2. 字段格式化
对从数据库中获取的日起进行格式化,数据库中格式是:2020-06-20 03:32:28.376772,格式化之后是:2020-06-20 03:32:28,
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=5, error_messages={'max_length': '字段太长!'})
alias = serializers.CharField(source='name')
register_date = serializers.DateTimeField(format='%Y-%m-%d %X') # 在这里进行的格式化
class Meta:
model = models.User
fields = ('name', 'alias', 'register_date')
class User(views.APIView):
def get(self, request):
qs = models.User.objects.all()
serializer = UserSerializer(qs, many=True)
return response.Response({
'status': 0,
'data': serializer.data
})
3. 字段创建
字段别名的方式可以认为是创建新的字段,但是它还是依赖于原字段,不是真正意义上的创建新字段:
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=5, error_messages={'max_length': '字段太长!'})
alias = serializers.CharField(source='name')
register_date = serializers.DateTimeField(format='%Y-%m-%d %X')
"""
创建新字段,自定义名字是id
"""
# id = serializers.SerializerMethodField(method_name='get_id') # 可以指定使用的方法名称
id = serializers.SerializerMethodField() # 可以不指定默认是:get_id,需要写get_id方法
def get_id(self, instance):
"""
:param instance: 查询的结果(直接写上instance就可以获取instance)
:return:
"""
return instance.pk
class Meta:
model = models.User
fields = ('name', 'alias', 'register_date', 'id')
class User(views.APIView):
def get(self, request):
qs = models.User.objects.all()
serializer = UserSerializer(qs, many=True)
return response.Response({
'status': 0,
'data': serializer.data
})
4. 字段加工
一般情况下,网站的图片使用CDN加速,CDN可能来自不同的CDN服务提供商。如果要换CDN服务提供商,那么接口返回的所有图片链接都需要更新。如果我们对链接部分进行处理,让链接的域名部分可以独立出来,这样如果换提供商,直接修改域名就可以了,下面是个简单的示例:
class ImagePathField(serializers.Field):
def __init__(self, domain=None, *args, **kwargs):
self.domain = domain
super(ImagePathField, self).__init__(*args, **kwargs)
def to_representation(self, value):
if not self.domain:
self.domain = 'www.aistudies.com.cn'
# return '{}' + '{}.png'.format(self.domain, value)
return f'{self.domain}/{value}.jpg'
def to_internal_value(self, data):
return data
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=5, error_messages={'max_length': '字段太长!'})
alias = serializers.CharField(source='name')
register_date = serializers.DateTimeField(format='%Y-%m-%d %X')
images = serializers.CharField()
# 如果source=None,则返回给客户端的img是null
img = ImagePathField(domain='www.baidu.com', source='images')
def get_id(self, instance):
"""
:param instance: 查询的结果(直接写上instance就可以获取instance)
:return:
"""
return instance.pk
class Meta:
model = models.User
fields = ('name', 'alias', 'register_date', 'id', 'images', 'img')
class User(views.APIView):
def get(self, request):
qs = models.User.objects.all()
serializer = UserSerializer(qs, many=True)
return response.Response({
'status': 0,
'data': serializer.data
})
只是作为例子使用了下,当然这里还是有很多问题的!