Django REST framework之API字段的定製

表中的字段有時候是不能滿足我們實際需要的,所以大多情況下我們需要 加工從數據庫中獲取到的字段,以及擴展更多的字段。也可能獲取別的表的字段進行數據加工生成新字段,響應給前端讓它做數據渲染。下面是對字段處理的幾種方式:

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
        })

在這裏插入圖片描述
只是作爲例子使用了下,當然這裏還是有很多問題的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章