基於seriallizer類進行簡化
html
https://www.cnblogs.com/pythonywy/p/11455508.htmlpython
導入from rest_framework import serializers
框架
與基礎serializer類後續使用的做用類似
函數
class 自定義名稱(serializers.ModelSerializer): class Meta: model=對應的模型 fields=('參與序列化和反序列的字段1','參與序列化和反序列的字段2') #fields='__all__' 爲全部字段 # exclude = ('id', 'is_delete') # 刨除某些字段 # depth = 1 # 跨表自動深度(展現外鍵表的全部字段)
注意點post
fields
與exclude
不能共存depth
不能控制顯示字段,與外鍵相關的表會所有顯示出來例若有兩個模型A
與B
,他們的c字段有外鍵關聯ui
modles.pyrest
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')
反序列話約數條件設置
code
class 自定義名稱(serializers.ModelSerializer): class Meta: model=對應的模型 fields=('參與序列化和反序列的字段1','參與序列化和反序列的字段2') extra_kwargs ={ 參與序列化和反序列的字段1:{ 'required': True, #必須填寫的字段 'min_length': 3, #.....約數條件 'error_messages': { 'min_length': '過短' } } }
只讀只寫屬性設置
htm
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