Django rest framework serializer基本用法

serializer的作用

以下僅爲個人看法。最後面我會附上序列化器參數圖。
1.規定前端傳入的參數
2.規定參數的類型
3.將參數序列化 我的理解也就是轉變成字典
4.規定後端返回數據字段
5.規定後端返回數據字段類型
6.檢查參數
7.序列化數據

規定參數

class CheckedParamSerializer(serializers.Serializer):
    ad_id = serializers.IntegerField(required=True)
    is_pass = serializers.BooleanField(required=True)
    reject_desc = serializers.CharField(max_length=64, default='', allow_blank=True)
    location = serializers.ListField(required=False)
    credit_ratio = serializers.DecimalField(max_digits=9, decimal_places=2, required=False)
	
	def create(self):
		pass
	
	def update(self):
		pass

這是我項目中用到的一段序列化器。
這些類型應該不用解釋。只要是學過編程的都能看懂。解釋下類型裏面的參數
1.required 是否比傳 如果值爲Flase 那麼前端可以不用傳這個參數如果是True那麼前端就必須傳入
2.max_length 是限制字符的最大長度。
3. default 這個應該很好理解這個就是默認值
4. allow_blank 這個也是隻有char類型有的參數當該字段不是比傳參數時可以爲空 如果allow_blank的值爲False就代表不能爲空
5. max_digits 這是浮點型裏面的參數,爲最多位數,上面的例子就說明credit_ratio 最多9位數字
6. decimal_places 小數點位置 比如 1.02
使用serializer.Serializer需要重寫create和update方法因爲這是個serializer中的抽象方法。你也可以單獨封裝一個serializer然後向上面例子一樣只是重寫兩個方法,然後其他的序列化器繼承這個封裝的序列化器從而達到沒有警告的問題。

規定返回數據

class ReturnDataSerializer(serializers.Serializer):
    ad_id = serializers.IntegerField(read_only=True)
    ad_name = serializers.CharField(max_length=20, read_only=True)
    ad_type = serializers.IntegerField(read_only=True)

read_only 光看單詞意思也明白了 ,read_only=True 我的理解是必須返回此字段。如果爲False可以不返回。
read_only:True表示不允許用戶自己上傳,只能用於api的輸出。如果某個字段設置了read_only=True,那麼就不需要進行數據驗證,只會在返回時,將這個字段序列化後返回
舉個簡單的例子:在用戶進行購物的時候,用戶post訂單時,肯定會產生一個訂單號,而這個訂單號應該由後臺邏輯完成,而不應該由用戶post過來,如果不設置read_only=True,那麼驗證的時候就會報錯。
write_only: 與read_only對應
required: 顧名思義,就是這個字段是否必填。
allow_null/allow_blank:是否允許爲NULL/空 。

使用Model來規定序列化器的數據

class ModelsRuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserDetail
        fields = ("name", "gender", "birthday", "email", "mobile")
        # fields = '__all__': 表示所有字段
        # exclude = ('add_time',):  除去指定的某些字段
        # 這三種方式,存在一個即可

ModelSerializer已經重載了create與update方法,它能夠滿足將post或patch上來的數據進行進行直接地創建與更新,除非有額外需求,那麼就可以重載create與update方法。
  ModelSerializer在Meta中設置fields字段,系統會自動進行映射,省去每個字段再寫一個field。

ModelSerializer需要解決的2個問題:

1,某個字段不屬於指定model,它是write_only,需要用戶傳進來,但我們不能對它進行save( ),因爲ModelSerializer是基於Model,這個字段在Model中沒有對應,這個時候,我們需要重載validate!
如在用戶註冊時,我們需要填寫驗證碼,這個驗證碼只需要驗證,不需要保存到用戶這個Model中:

def validate(self, attrs):
    del attrs["code"]
    return attrs

2,某個字段不屬於指定model,它是read_only,只需要將它序列化傳遞給用戶,但是在這個model中,沒有這個字段!我們需要用到SerializerMethodField。
  假設需要返回用戶加入這個網站多久了,不可能維持這樣加入的天數這樣一個數據,一般會記錄用戶加入的時間點,然後當用戶獲取這個數據,我們再計算返回給它。

class UserSerializer(serializers.ModelSerializer):  
    days_since_joined = serializers.SerializerMethodField()
    # 方法寫法:get_ + 字段
    def get_days_since_joined(self, obj):
    # obj指這個model的對象
        return (now() - obj.date_joined).days

    class Meta:
        model = User

當然,這個的SerializerMethodField用法還相對簡單一點,後面還會有比較複雜的情況。

many參數

如果關聯的對象數據不是隻有一個,而是包含多個數據,如想序列化圖書BookInfo數據,每個BookInfo對象關聯的英雄HeroInfo對象可能有多個,此時關聯字段類型的指明仍可使用上述幾種方式,只是在聲明關聯字段時,多補充一個many=True參數即可。
假如說我們有個BookInfo的序列化器

class BookInfoSerializer(serializers.Serializer):
    btitle = serializers.CharField(min_length=3,max_length=20)
    bpub_date = serializers.DateField()
    bread = serializers.IntegerField(read_only=True)
    # 此字段將被序列化爲關聯對象的主鍵。
    heroinfo_set = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
    # 此字段將被序列化爲關聯對象的字符串表示方式(即__str__方法的返回值)
    heroinfo_set = serializers.StringRelatedField(read_only=True,many=True)
    # 使用關聯對象的序列化器
    heroinfo_set = HeroInfoSerializer(many=True)
from bookapp.serializers import BookInfoSerializer
from bookapp.models import BookInfo

book = BookInfo.objects.get(id=2)
serializer = BookInfoSerializer(book)
serializer.data
{'btitle': '天龍八部', 'bread': 36, 'bpub_date': '1986-07-24', 'heroinfo_set': [OrderedDict([('hname', '喬峯'), ('hcomment', '降龍十八掌')]), OrderedDict([('hname', '段譽'), ('hcomment', '六脈神劍')]), OrderedDict([('hname', '虛竹'), ('hcomment', '天山[('hname', '王語嫣'), ('hcomment', '神仙姐姐')])]}

序列化器參數圖:
在這裏插入圖片描述

其他技巧請看:
1.https://blog.csdn.net/l_vip/article/details/79156113?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

2.https://www.jianshu.com/p/26529651aa27

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