drf---序列化器的坑(完整版)

1. 序列化器,未声明的字段

如果一个字段未声明,在全局钩子/局部钩子/validated_data/....都是拿不到的,只能request.data去拿

2. 反序列化的时候,可以传[{'name':dbj",'xx':'11'}]这种格式吗?

2.1 必须可以,

2.2 但是序列化器必须嵌套

2.3 案例

url

 path('t1/', views.T2.as_view()),

view

class t1(APIView):
    def post(self, request, *args, **kwargs):
        ser = T2(data=request.data)
        if ser.is_valid()
            ser.save()
            return Response('ok')
        return Response('nok')

serializer

# 测试前端传送过来一个列表

class T1(serializers.Serializer):
    name2 = serializers.CharField()
    name3 = serializers.CharField()


class T2(serializers.ModelSerializer):
    t1 = T1(many=True)  # many=True---反向的时候要写,正向不需要写

    class Meta:
        model = models.Release
        fields = ['content', 't1']

    def validate(self, attrs):
        print(attrs)
        # OrderedDict([('content', 'aa'), ('t1', [OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')])])])

    def create(self, validated_data):
        print(validated_data)
    # OrderedDict([('content', 'aa'), ('t1', [OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')])])])

前端传送数据格式

 {
    "content":"aa",
    "t1":[
        {"name2":"1","name3":"3"},
        {"name2":"1","name3":"3"},
        {"name2":"1","name3":"3"}
        
    ]
}

3.对于表中是外键的字段,反序列化的时候,数据怎么传?

3.2 前端传id即可,他会自动把前端传过来的id,去数据库映射成其所对应的对象模型,

3.3 保存,类似  user_id = 1 

4. CreateAPIView

4.1 CreateAPIView,如果仅仅新增,那么不用配置queryset

4.2 案例

class PublishDataAPIView2(CreateAPIView):
    """最新版上传"""
    # queryset = models.Release.objects.filter(is_show=True, is_delete=False)
    serializer_class = ReleaseModelSerializer

5. RetrieveAPIView

class IndexDetailRetrieveAPIView(RetrieveAPIView):
    queryset = models.Release.objects.filter(is_show=True, is_delete=False)
    serializer_class = IndexDetailDataModelSerializer

6. 反序列化的时候,数据库动态新增的字段,无法序列化返回


1.1. 在序列化返回字段的时候,只能序列化,数据库原先有的字段。

1.2. 如果在反序列化的过程中,给数据库增加新的字段,同一次请求,序列化的时候,返回的,还是原先数据库,原有的字段,新增的字段,无法返回

2. 解决办法

手动从数据库获取,想要的字段,传给response,让其json化(我们返回前端的,大部分都是json格式)
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪去兜风z1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值