關於序列化和反序列化
在談論前,先說一下序列化和反序列化,這兩個概念最初是在學習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