drf 中的序列化器

drf 中的序列化器

序列化器 和 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 : 设置要查询的数据
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值