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 : 設置要查詢的數據