drf框架serializers中ModelSerializer類簡化序列化和反序列化操作


0905自我總結

drf框架serializers中ModelSerializer類

基於seriallizer類進行簡化

https://www.cnblogs.com/pythonywy/p/11455508.html

一.簡單的使用

導入from rest_framework import serializers

與基礎serializer類后續使用的作用相似

class 自定義名稱(serializers.ModelSerializer):
    class Meta:
        model=對應的模型
        fields=('參與序列化和反序列的字段1','參與序列化和反序列的字段2')
        #fields='__all__'  為所有字段
        # exclude = ('id', 'is_delete')  # 刨除某些字段
        # depth = 1  # 跨表自動深度(展示外鍵表的所有字段)

注意點

  • 其中fieldsexclude不能共存
  • depth不能控制顯示字段,與外鍵相關的表會全部顯示出來

二.利用模型類中的方法進行指導字典的生成

例如有兩個模型AB,他們的c字段有外鍵關聯

modles.py

class B(models.Model):
    name = models.CharField(max_length=60)
    
class A(models.Model):
    uid = models.ForeignKey(B,'id')
    
    @property    #下面調用函數名的時候自動運行函數
    def b_name(self):  #這里的self是A類
        return self.uid.name
        
class AModelSerializer(serializers.ModelSerializer):
        class Meta:
        	model=A   #這里導入A會把A里面的所有名稱空間存在的都進行導入
            fields=('b_name')

三.另外總方法完成深度查詢

class B(models.Model):
    name = models.CharField(max_length=60)
    
class A(models.Model):
    uid = models.ForeignKey(B,'id')

#方法一
class BModelSerializer(serializers.ModelSerializer):
        class Meta:
        	model=B   
            fields=('b_name')
 
class BModelSerializer(serializers.ModelSerializer):
     	b_name = BModelSerializer()
        class Meta:
        	model=A   #這里導入A會把A里面的所有名稱空間存在的都進行導入
            fields=('b_name')
            
#方法二
#通過自定義字段
class BModelSerializer(serializers.ModelSerializer):
     	  b_name = serializers.SerializerMethodField()
   		  def get_b_name(self, obj: models.A):
               return A.uid.name
        class Meta:
        	model=A   #這里導入A會把A里面的所有名稱空間存在的都進行導入
            fields=('b_name')

四.ModelSerializer對於反序列話約數條件設置及只讀只寫屬性設置

反序列話約數條件設置

class 自定義名稱(serializers.ModelSerializer):
    class Meta:
        model=對應的模型
        fields=('參與序列化和反序列的字段1','參與序列化和反序列的字段2')
        extra_kwargs ={
            參與序列化和反序列的字段1:{
                'required': True,  #必須填寫的字段
                 'min_length': 3,
                #.....約數條件
                'error_messages': {
                    'min_length': '太短'
                   
                }
            }
        }

只讀只寫屬性設置

class 自定義名稱(serializers.ModelSerializer):
    class Meta:
        model=對應的模型
        fields=('參與序列化和反序列的字段1','參與序列化和反序列的字段2')
        extra_kwargs ={
            參與序列化和反序列的字段1:{
				 'write_only': True #只寫
            }
        	參與序列化和反序列的字段2:{
				 'read_only': True #只讀
            }
        }

五.視圖層使用

數據沒有修改

class BookAPIView(APIView):    
    def get(self, request, *args, **kwargs):
        book_query = models.Book.objects.all()  #假設查我們定義的書的這個模型
        book_ser = serializers.BookModelSerializer(book_query, many=True)
        return Response(0, 'ok', results=book_ser.data) #用drf框架自帶的Response

有添加修改相關操作

class BookAPIView(APIView):    
    def post(self, request, *args, **kwargs):
        pk=kwargs.get('pk')
        book_obj = models.Book.objects.get('pk')
        book_ser = serializers.BookModelSerializer(instance=book_obj,data=request.data) #根據傳進來的數據機芯判斷
        #如果多個數據為book_set = serializers.BookModelSerializer(data=request.data many=true)
        if book_ser.is_valid():  #這里是我們設置的ModelSerializer的約數條件看是否能通過
            book_ser.save()  #這里他會自動進行判斷是create方法還是update方法
            return Response(0, 'ok',results=book_ser.data)
        else:
            return Response(1, '添加失敗', results=book_ser.errors)#用drf框架自帶的Response
  • 注意點:save源碼中我們可以看到instance有值調用updata方法,沒有值調用create方法.所以修改必須加instance參數,傳的參數基本上是修改之前的對象

有關刪除

class BookAPIView(APIView):    
    def post(self, request, *args, **kwargs):
        book_ser = serializers.BookModelSerializer(data=request.data) #根據傳進來的數據機芯判斷
        #如果多個數據為book_set = serializers.BookModelSerializer(data=request.data many=true)
        if book_ser.is_valid():  #這里是我們設置的ModelSerializer的約數條件看是否能通過
            book_ser.deleter()  #這里他會自動進行判斷是create方法還是update方法
            return Response(0, 'ok',results=book_ser.data)
        else:
            return Response(1, '刪除失敗', results=book_ser.errors)#用drf框架自帶的Response


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM