表中的字段有時候是不能滿足我們實際需要的,所以大多情況下我們需要 加工從數據庫中獲取到的字段,以及擴展更多的字段
。也可能獲取別的表的字段進行數據加工生成新字段,響應給前端讓它做數據渲染。下面是對字段處理的幾種方式:
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
})
只是作爲例子使用了下,當然這裏還是有很多問題的!