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 : 设置要查询的数据