這類型字段格式都是一個字典類型,數據庫中存儲key,給客戶端顯示的是對應的value,可是正常的數據庫操做只能讀取key,拿不到value,這個時候須要用到source方法。數據庫
Note
格式爲:source = 'get_提取的字段名_display',便可顯示valuedjango
class UserInfoSerializer(serializers.Serializer): user_type = serializers.CharField(source='get_user_type_display')
若是咱們須要在序列化類中經過本類得到外鍵關聯的類的具體字段信息,那麼也須要用到source方法,格式上略有不一樣。函數
Note
格式爲:source = '本類中定義的外鍵名.但願得到的字段名'
本類中關聯的外鍵名實質上就是外鍵的實例化對象,能夠經過對象.屬性的方式得到code
class UserInfoSerializer(serializers.Serializer): group = serializers.CharField(source='usergroup.title')
多對多關係中,若是用哪一個第二種方式去編寫的代碼得到不到具體的字段信息,本類中定義的外鍵名.all獲得的是由具體對象組成的列表,若是但願得到對應的每個對象的具體字段信息,須要自定義個函數來執行對象
Note開發
- 字段類型必須是:serializers.SerializerMethodField()
- 自定義函數參數傳遞爲row, 經過row.關聯的字段名.all()獲取所對多中全部的關聯對象信息
class UserInfoSerializer(serializers.Serializer): role = serializers.SerializerMethodField() def get_role(self, row): row_obj_list = row.role.all() # 獲取到對應的全部對象列表 ret = {} for item in row_obj_list: ret[item.id] = item.title # 因爲得到的是一個對象列表,因此咱們須要遍歷出每個對對象,再經過對象來得到每個字段信息 return ret
Note
自定義的設置在ModelSerializer類下一樣適用get
class UserInfoSerializer1(serializers.ModelSerializer): user_type = serializers.CharField(source='get_user_type_display') usergroup = serializers.CharField(source='usergroup.title') class Meta: model = UserInfo fields = ['id', 'user_type','usergroup', 'role'] depth = 1 # 自動序列化連表操做:depth表示的是在從數據庫中獲取數據是的深度,默認爲0,表示只取最外層,當1的時候指的是再往下取一層,django設置的最大深度爲10,但實際的開發中最好不要超過三層