Django:(08)序列化器

一、序列化和反序列化
變量從內存中變成可存儲或傳輸的過程稱之爲序列化,序列化以後,就能夠把序列化後的內容寫入磁盤,或者經過網絡傳輸到別的機器上。
反過來,把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化。網絡

序列化是將對象狀態轉換爲可保持或可傳輸的形式的過程。序列化的補集是反序列化,後者將流轉換爲對象。這兩個過程一塊兒保證數據易於存儲和傳輸。函數

二、Django中序列化器的定義和使用
定義:兩種方法定義序列化器(serializer/ModelSerializer)ui

class CartSKUSerializer(serializers.ModelSerializer): """ 購物車商品數據序列化器 """ count = serializers.IntegerField(label='數量') class Meta: model = SKU fields = ('id', 'name', 'default_image_url', 'price', 'count')

 

使用:
  查詢模型類
  實例一個序列化器,傳入模型類對象
  獲取序列化後的結果(data屬性)url

query_set = Department.objects.all() serializer = DepartmentSerializer(query_set, many=True)# 傳入對象集時需指定many=True
serializer.data

 

三、Django中反序列化的參數校驗
基本校驗:
  序列化器的建立: 經過data傳入字典數據:spa

Serializer(instance=None, data=empty, **kwarg)

 

  經過is_valid方法校驗參數合法性
  errors屬性: 獲取校驗出錯信息,字典類型。
  validated_data屬性: 校驗經過獲得的對象,類型爲OrderedDict
經過 validators選項校驗
  在序列化器字段中添加validators選項參數進行校驗
  定義函數:code

def validate_name(value): # 校驗部門名稱
    if not re.match('^[\u4e00-\u9fa5]+$', value): raise ValidationError('部門名稱只能爲中文') return value

  在字段參數中添加選項:validators=[validate_name]對象

name = serializers.CharField(validators=[validate_name])

 

validate_<field>:對<field_name>字段進行驗證blog

class DepartmentSerializer(serializers.Serializer): """部門數據序列化器""" ... def validate_name(self, value): # 校驗部門名稱
        if not re.match('^[\u4e00-\u9fa5]+$', value): raise ValidationError('部門名稱只能爲中文') return value

 

validate:同時對多個字段進行比較驗證內存

# 模型: users/models.py
 class User(models.Model): password = models.CharField(max_length=30) # 序列化器: users/serializer.py
 class UserSerializer(serializers.Serializer): password = serializers.CharField(max_length=30, write_only=True) password2 = serializers.CharField(max_length=30, write_only=True) def validate(self, attrs): # 校驗兩次輸入的密碼是否正確
         password = attrs['password'] password2 = attrs['password2'] if password != password2: raise serializers.ValidationError('兩次輸入的密碼不同') return attrs

 

三、Django中反序列化保存和修改數據
get

  1. Serializer類的三個方法

    • save()方法: 保存數據
    • create()方法: 新增數據
    • update()方法: 修改數據
  2. 新增或修改數據

    Serializer(instance=None, data=empty)

     

    1. 新增:建立序列化器時,沒有傳遞了instance參數

      my_dict = {'name': '研發部xx', 'create_date': '2018-1-1'} s = DepartmentSerializer(data=my_dict) s.save() # 新增

       

    2. 修改:建立序列化器時,傳遞了instance參數

      department = Department.objects.get(id=1) my_dict = {'name': '研發部xx', 'create_date': '2018-1-1'} s = DepartmentSerializer(instance=department, data=my_dict) s.save() # 修改

       

    3. 部分修改:partial=True 參數

      1. 當修改數據時,序列化器默認要求傳遞全部required=True的字段,不然is_valid驗證不經過
      2. 能夠經過設置partial=True容許只修改部分字段,以下:

s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)

四、模型類序列化器

定義
  model 指明參照哪一個模型類
  fields 指定序列化器中的屬性有哪些 (能夠是模型類中的字段,也能夠模型類中沒有的但須要校驗的屬性,好比相似:短信驗證碼,確認密碼)

class DepartmentSerializer2(serializers.ModelSerializer): class Meta: model = Department fields = '__all__' # 包含模型類中全部的字段

指定序列化器中包含哪些字段:fields = ('id', 'name') 排除掉模型類中指定的字段:exclude = ('is_delete',) 指明只讀字段   read_only_fields = ('id', 'create_date')   僅用於序列化輸出,在反序列化時不會進行校驗和修改 指定 關聯屬性的序列化方式

相關文章
相關標籤/搜索