drf - 序列化器

drf 中的序列化器 (serializer)

序列化器 和 django中 的 form 和 modelform 有類似的地方 ,
因爲 在 drf 中,沒有模板的概念,所以 序列化的主要作用
是對響應的數據做序列化的, 還可以對 接收到的數據做序列化

django 中 的序列化

  • django.forms.model_to_dict (只能對模型對象做序列化)
  • django.core.serializers.serialize (只能對queryset做序列化)
  • serialize 序列化出來的內容,有太多是不需要的

drf 中的序列化

  • rest_framework.serializers.Serializer
  • rest_framework.serializers.ModelSerializer
  • rest_framework.serializers.HyperlinkedModelSerializer

Serializer 序列化器

Serializer 序列化 查詢的結果

  • 在 某應用下,創建一個 serializers.py
  • 自定義一個序列化類,繼承 Serializer
  • 在序列化類中,定義 要序列化的 屬性
  • 在 視圖中,使用 自定義的序列化類,序列化數據
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
serializer.data 

PS : 序列化類中,定義的屬性,只能比要序列化的模型 屬性 只能少, 不能多

Serializer 接收參數

serializer = UserSerializer(data=request.data)
  
if serializer.is_valid():
	...
	return Response(...)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Serializer create 功能

  • Serializer 默認不能使用 save功能進行數據的存儲,如果要存儲數據,應該重寫父類的 create方法
class UserSerializer(serializers.Serializer):
	...
	def create(self, validation_data):
		return User.objects.create(**validation_data)

Serialzie update 功能

  • Serializer 默認不能使用 save功能進行數據的更新,如果要更新數據,應該重寫父類的 update方法
class UserSerializer(serializers.Serializer):
	...
	def update(self, instance,  validation_data):
		queryset = User.objects.filter(pk=instance.pk)
		queryset.update(**validation_data)
		return queryset[0]

更新代碼或者參考官方示例

ModelSerializer 是和模型綁定的一個序列化類,作用類似於 ModelForm

class UserSerializer(serializrs.ModelSerializer):
  
	class Meta:
		model = User 
		fields = ['username', 'password', 'sex']

或者

class UserSerializer(serializrs.ModelSerializer):
  
	class Meta:
		model = User 
		fields = "__all__"

HyperlinkedModelSerializer

PS: 該類在使用的時候,會產生一個錯誤
HyperlinkedIdentityField requires the request in the serializer context.
Add context={'request': request} when instantiating the serializer.

HyperlinkedModelSerializer 默認會 將 主鍵 轉爲 url
默認的轉換規則是 根據 pk 去查詢 view_name = “模型名小寫-detail” 的視圖

要想覆蓋他的 默認行爲 ,則可以 在 class Meta 中,添加一個 extra_kwargs
具體代碼如下:

class UserSerializer(HyperlinkedModelSerializer):
  
	class Meta:
		model = User 
		fields = "__all__"
		extra_kwargs = {
			"url"" : {
				"view_name": "指定查單條記錄的  view_name即可",
				"lookup_field": "默認是 pk,可以自己定義需要的佔位符"
			}
		}

關聯關係 在序列化中的使用

PS : 在 多的一方、序列化數據的時候,默認顯示一方的pk值

顯示關係屬性的指定的某個屬性

在 序列化器 中 ,覆蓋 關係屬性,使用 ReadOnlyField(source=“模型小寫.模型屬性”)

class  AddressSerializer(serializers.ModelSerializer):
	user = serializers.ReadOnlyField(source="user.pk")
class Meta:
	...

顯示關係屬性的指定的所有屬性

class  AddressSerializer(serializers.ModelSerializer):
	user = UserSerializer()
class Meta:
	...

顯示關係屬性的 用 地址來顯示

class  AddressSerializer(serializers.ModelSerializer):
	user = HyperlinkedRelatedField(view_name="user-detail", lookup_field="pk", read_only=True)
class Meta:
	...

HyperlinkedRelatedField : 根據關係屬性對應的ID進行數據的查詢
HyperlinkedIdentityField : 根據序列化類對應的模型的主鍵進行查詢

HyperlinkedRelatedField/HyperlinkedIdentityField常見的屬性有:

  • view_name : 查詢的視圖名
  • lookup_field : 設置按照某個屬性進行查詢,默認是 pk
  • ready-only : 是否爲只讀、默認爲 False
  • many : 是否查詢多值,默認是 False
  • queryset : 設置要查詢的數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章