關於定義序列化器時,read_only和write_only有什么作用


關於序列化和反序列化

在談論前,先說一下序列化和反序列化,這兩個概念最初是在學習json的時候提出來的,回頭來看,其實可以用最初的理解就可以了

  • 序列化就是將對象轉化方便傳輸和存儲字節序列,例如json.dumps就是序列化(狹義的序列化,將字典轉化為json字符串),這樣得到的json字符串不僅直接可以在其他語言使用(跨平台比較好),而且可以在前后端進行傳輸交互(drf序列化器)

  • 反序列化恰恰相反,而是將字節序列轉化為對象,json.loads是將json字符串轉化為字典,是狹義的反序列化(因為在python, 一切皆對象,字典是dict( )),而在項目中,前端傳過來的序列化數據通過反序列化得到對象,進一步可以通過ORM操作,存入數據庫。

關於read_only和write_only(在drf序列化器定義字段時使用)

之所以會有read_only和write_only的疑問,主要和序列化與反序列化有關,所以我會從這兩個角度來分析

  • read_only 是只讀,不能寫(可以理解為只能從后台到前台,后台操作后直接傳前台),就是不能對字段進行修改操作(也就是不和數據庫進行交互),用在序列化字段里。下面的例子中,gender只用於傳到前端展示。而不用於存到數據庫
#model.py
class User(models.Model):
	sex=CharField(
        choices=((0, ‘男’), (1,‘女’))
    )
    #自定義序列化
    @property
    def gender(self):
        return self.get_sex_diaplay()
    
    
#serializer.py

class UserModelSerializer(ModelSerializer):
    class Meta;
    	model = models.User
        fields = ('gender')
        extra_kwargs = {
            'gender': {
                'read_only':True,
            },
        }


'''
gender字段只用於把 sex中選項對應的漢字傳到前端展示,不與數據庫進行交互,而存到數據庫的是sex的數字
'''
  • write_only是只寫不能讀,可以理解為只能前台到后台,在后台做了邏輯操作后直接存數據庫,在反序列化字段使用。在下面的例子中,password就是反序列化,不需要傳前台,而re_password是自定義反序列化字段,僅用作后台和密碼進行比較,然后把結果返回前台,所以不存到數據庫,在全局鈎子使用時要pop掉
#model.py
class User(model.Model):
    pwd = models.CharField()
    
#serializers.py
class UserModelSerializer(ModelSerializer):
    re_pwd = serializers.CharField(min_length=3, max_length=64, write_only=True) #自定義反序列化字段,一定是write_only=True
    class Meta:
        model = models.User
        fields = ['pwd', 're_pwd']
        extra_kwargs = {
            'pwd': {
                'write_only': True
            }
        }
    def validate(self, attrs):
        pwd = attrs.get('pwd')
        re_pwd = attrs.pop('re_pwd')
        if pwd != re_pwd:
            raise serializers.ValidationError({'re_pwd': '兩次密碼不一致'})
        return attrs


免責聲明!

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



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