序列化類中的自定義字段設置
1.針對具有choices屬性的字段的用法
這類型字段格式都是一個字典類型,數據庫中存儲key,給客戶端顯示的是對應的value,但是正常的數據庫操作只能讀取key,拿不到value,這個時候需要用到source方法。
Note
格式為:source = 'get_提取的字段名_display',即可顯示value
class UserInfoSerializer(serializers.Serializer):
user_type = serializers.CharField(source='get_user_type_display')
2.針對外鍵的用法
如果我們需要在序列化類中通過本類獲得外鍵關聯的類的具體字段信息,那么也需要用到source方法,格式上略有不同。
Note
格式為:source = '本類中定義的外鍵名.希望獲得的字段名'
本類中關聯的外鍵名實質上就是外鍵的實例化對象,可以通過對象.屬性的方式獲得
class UserInfoSerializer(serializers.Serializer):
group = serializers.CharField(source='usergroup.title')
3.針對多對多關系的用法
多對多關系中,如果用哪個第二種方式去編寫的代碼獲得不到具體的字段信息,本類中定義的外鍵名.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類下同樣適用
4.自動序列化連表操作:
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,但實際的開發中最好不要超過三層