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 # 跨表自動深度(展示外鍵表的所有字段)
注意點
- 其中
fields與exclude不能共存 depth不能控制顯示字段,與外鍵相關的表會全部顯示出來
二.利用模型類中的方法進行指導字典的生成
例如有兩個模型A與B,他們的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
