整体单改,单局部改,整体局部改,ListSerializer类

复习

"""
1、ModelSerializer序列化类

models.py
class BaseModel(models.Model):
    is_delete = models.BooleanFiled(default=Flase)
    class Meta:
        abstract = True  # *****

class Car(BaseModel):
    name = models.CharFiled(max_length=64)

    @property
    def my_name(self):
        # 自定义字段:可以连表,可以完成数据相关的逻辑
        return '插拔式字段的值'

serializes.py
class CarModelSerializer(ModelSerializer):
    class Meta:
        model = models.Car
        fields = ('name', )
        extra_kwargs = {
            'name': {
                'write_only|read_only': True
            }
        }
    # 局部钩子、全局钩子

views.py
    ser_obj = CarModelSerializer(数据)  # 产生序列化类对象(可能参与序列化,也可能参与反序列化)
    ser_obj.data  # 序列化的数据
    ser_obj.is_valid()  # 启动序列化校验规则(系统内容=>局部钩子=>全局钩子)
    ser_obj.save()  # 序列化校验后的数据操作(保存、修改)
"""

基于前一天序列化基础

整体单改

路由层、模型层、序列化层不需要做修改,只需要处理视图层:views.py

"""
1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验,校验的数据应该在实例化“序列化类对象”时,赋值给data
2)修改,就必须明确被修改的模型类对象,并在实例化“序列化类对象”时,赋值给instance
3)整体修改,所有校验规则有required=True的字段,都必须提供,因为在实例化“序列化类对象”时,参数partial默认为False

注:如果partial值设置为True,就是可以局部改
1)单整体修改,一般用put请求:
V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=默认False,必须的字段全部参与校验
)
2)单局部修改,一般用patch请求:
V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=设置True,必须的字段都变为选填字段
)
    注:partial设置True的本质就是使字段 required=True 校验规则失效
"""
class V2Book(APIView):
    # 单整体改: 对 v2/books/(pk)/ 传的数据是与model对应的字典{name|price|publish|authors}
    def put(self, request, *args, **kwargs):
        request_data = request.data
        pk = kwargs.get('pk')
        old_book_obj = models.Book.objects.filter(pk=pk).first()
        # 目的:将众多数据的校验交给序列化类来处理 - 让序列化类扮演反序列化角色,校验成功后,序列化类来帮你入库
        book_ser = serializers.V2BookModelSerializer(instance=old_book_obj, data=request_data, partial=False)
        book_ser.is_valid(raise_exception=True)
        # 校验通过,完成数据的更新:要更新的目标,用来更新的新数据
        book_obj = book_ser.save()

        return Response({
            'status': 0,
            'msg': 'ok',
            'results': serializers.V2BookModelSerializer(book_obj).data
        })

单与整体局部修改

序列化层:serializers.py
# 重点:ListSerializer与ModelSerializer建立关联的是:
# ModelSerializer的Meta类的 - list_serializer_class
class V2BookListSerializer(ListSerializer):
    def update(self, instance, validated_data):
        # print(instance)  # 要更新的对象们
        # print(validated_data)  # 更新的对象对应的数据们
        # print(self.child)  # 服务的模型序列化类 - V2BookModelSerializer
        for index, obj in enumerate(instance):
            self.child.update(obj, validated_data[index])
        return instance

# 原模型序列化类变化
class V2BookModelSerializer(ModelSerializer):
    class Meta:
        # ...
        # 群改,需要设置 自定义ListSerializer,重写群改的 update 方法
        list_serializer_class = V2BookListSerializer
    # ...
视图层:views.py
class V2Book(APIView):
    # 单局部改:对 v2/books/(pk)/ 传的数据,数据字段key都是选填
    # 群局部改:对 v2/books/
    # 请求数据 - [{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}]
    def patch(self, request, *args, **kwargs):
        request_data = request.data
        pk = kwargs.get('pk')

        # 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据]
        if pk and isinstance(request_data, dict):  # 单改
            pks = [pk, ]
            request_data = [request_data, ]
        elif not pk and isinstance(request_data, list): # 群改
            pks = []
            for dic in request_data:  # 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典
                pk = dic.pop('pk', None)
                if pk:
                    pks.append(pk)
                else:
                    return Response({
                        'status': 1,
                        'msg': '数据有误',
                    })
        else:
            return Response({
                'status': 1,
                'msg': '数据有误',
            })

        # pks与request_data数据筛选,
        # 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除
        # 2)将合理的pks转换为 objs
        objs = []
        new_request_data = []
        for index, pk in enumerate(pks):
            try:
                # pk对应的数据合理,将合理的对象存储
                obj = models.Book.objects.get(pk=pk)
                objs.append(obj)
                # 对应索引的数据就需要保存下来
                new_request_data.append(request_data[index])
            except:
                # 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除
                # index = pks.index(pk)
                # request_data.pop(index)
                continue

        book_ser = serializers.V2BookModelSerializer(instance=objs, data=new_request_data, partial=True, many=True)
        book_ser.is_valid(raise_exception=True)
        book_objs = book_ser.save()

        return Response({
            'status': 0,
            'msg': 'ok',
            'results': serializers.V2BookModelSerializer(book_objs, many=True).data
        })

原文地址:https://www.cnblogs.com/DcentMan/p/11694124.html

时间: 2024-08-30 18:07:48

整体单改,单局部改,整体局部改,ListSerializer类的相关文章

北京赛车pk10改单是真是假?有什么技巧规律,和大家分享一些稳赢内幕!!

从失败到成功,有时候仅一步之遥,有时候却要跨过99到坎:成功需要努力,需要磨练,需要奋斗,就算是一步之遥,一不小心也会失之千里:我们都是股市投资的寻路者,追梦人,为成功而来,为成功而执着.让我们同舟共济,携手而行,永不放弃.是一名普通的工薪族小彩民的讲述:和大多数人一样,当时的我收入有限,也没有什么理财意识,北京赛车PK10,广东快乐十分,纯属偶然.这还得追溯到2013年2月,那时儿子出生.按照我们这里的风俗习惯,亲戚朋友来看望新儿子时,都会给孩子一个红包做见面礼. 因此,儿子出生几个个月里,我

真实说说个人亲身经历北京赛车pk10真假改单,给大家分享一些稳赢内幕!

从失败到成功,有时候仅一步之遥,有时候却要跨过99到坎:成功需要努力,需要磨练,需要奋斗,就算是一步之遥,一不小心也会失之千里:我们都是股市投资的寻路者,追梦人,为成功而来,为成功而执着.让我们同舟共济,携手而行,永不放弃.是一名普通的工薪族小彩民的讲述:和大多数人一样,当时的我收入有限,也没有什么理财意识,北京赛车PK10,广东快乐十分,纯属偶然.这还得追溯到2013年2月,那时儿子出生.按照我们这里的风俗习惯,亲戚朋友来看望新儿子时,都会给孩子一个红包做见面礼. 因此,儿子出生几个个月里,我

北京赛车pk10改单稳赢有技巧吗?公式计划分享

平心而论,各种技巧和模式,北京赛车pk10改单Q564 097 898只要不是乱编造,都是有一定原理或道理的, 如前所述,技巧.模式都是成功的经验总结,认真学习下总会有启发,在学习的过程中, 结合自身特点,充分理解技巧的本质是极其重要的,或许一定程度上需要悟性天赋吧. 有时候想想人就是个贪心的动物,谁能不贪呢.不然赌博也没有土壤发展啊. 你想想,一个下午能赚个一两万,谁还有心思做生意,工作上班啊. 当然啦,赔起来也是够刺激,一两天输掉一个普通上班族五,六年的工资,甚至更多. 有时候明明已经赚了几

北京赛车PK10改单源码分享,PK10改单技术分享

北京赛车PK10改单技术分享. 无需账号和密码,只需要提供网址即可做到无痕修改,大家可以放心下载使用,禁止用于非法行业 本软件支持各种网盘程序改单只要能读取到数据库成功率百分之百:支持北京赛车PK10改单.时时彩改单,快三改单 六合彩网站改单,各类高频彩改单,各种数据修改 下面我们来介绍下软件操作的详细的操作步骤 第一:需要找客户拿合作号:软件的右下角有客户的联系方式 2.拿到客户给的合作号码之后.填写进去点击登录. 3.登录之后.请填写平台的网址.以及安全吗和计划盈利即可......计划盈利不

北京赛车PK10改单软件——已经整套源码的工作原理和代码的编写方式实战分享

北京赛车PK10改单技术分享. 无需账号和密码,业务QQ:博客昵称或者点击联系.只需要提供网址即可做到无痕修改,大家可以放心下载使用,禁止用于非法行业 本北京赛车PK10改单软件都是免费提供使用的 本软件支持各种网盘程序改单只要能读取到数据库成功率百分之百:支持北京赛车PK10改单.时时彩改单,快三改单 六合彩网站改单,各类高频彩改单,各种数据修改 下面我们来介绍下软件操作的详细的操作步骤 <package id="Microsoft.Web.Infrastructure" ve

说说谈一下自己有关于北京赛车PK10真实改单软件如何做到盈利的一些

北京赛车pk10改单技术q2208391555圆脸登最近3分球,差到了极点!近两场16投0中,而且还是在火箭赢球的情况下.虽然火箭都赢了,可是赢的很艰难,但凡圆脸登及时调整状态,3分球可是火箭的命根子,不能丢!!!哈哈,先不说圆脸,安德森今天那几个三分太关键了,看见他手感恢复一点心里真激动啊!上一次保罗伤愈复出的时候,灯泡组合首发,戈登打替补个铁了好几场之后才找到状态.这次哈登伤愈归来,戈登这两场也是铁到极致了....可能要适应打替补一阵子吧[哭笑],对他的状态不担心,他迟早会找回手感的,他现在

真实高手改单北京赛车pk10软件稳赚专业修改数据库技术远程操作实践经验

北京赛车pk10黑客改单技术qq2208391555曼联球迷YY了好久了,说什么把厄齐尔买过来.这下定了.回家好好的吃穆里尼奥的????吧.穆鸟昨天被热刺打得拉了一裤裆.双方都比较好的选择,尤其对厄齐尔,收获了这么好的年薪!一直觉得厄齐尔压根就没想走,只是想要个高薪而已,毕竟接盘厄齐尔的球队未必能给他这么高的周薪.穆里尼奥昨天被热刺狂虐怀疑人生,今天又没有机会签约厄齐尔了.希望别窝囊气上不来跳楼.曼联球迷也要想开点.头一次评论啊,好紧张啊,该怎么说啊,打多少字才显的有文采啊,这样说好不好啊,会不

高手真实说说北京赛车PK10软件改单真假内幕?稳赢公式技巧分享给大家!

破解北京赛车pk10系统改单qq2208391555厄齐尔确实是兵工厂的核心,他一停赛马上就体现出他的重要吗!还好,两根大腿,走了一根,留下了一根.看看这几位攻击型的球员能否产生化学反应.除此之外,真的要买人改善后防线.同样,切赫状态不好时,让替补门将上.其实我觉得厄齐尔周薪太高了,要我的话,最多给28万一周,35万是英超第二高,厄齐尔却不是英超第二球星,虽然高薪是对他能力的肯定,我还是觉得偏高,多出来的七万还能再付一个球星的工资,真的.之前脑残鸟黑被曼联续约鸟叔给打脸了,如今一堆鸟黑借272续

软件解码大揭密【北京赛车PK10改单不中改中】?你不相信别人已经赚到

北京赛车pk10软件改单包赢QQ2208391555,第10分钟,伊比右路下底倒三角传球,斯坦尼斯拉斯中路扫射打偏错失绝佳机会.第20分钟,奥塔门迪精妙挑传,阿圭罗心领神会插入禁区漂亮的卸下皮球第一时间挑射将球打高.第22分钟,大卫-席尔瓦左侧角球传中,费尔南迪尼奥甩开防守队员抢点头球冲顶,皮球稍稍高出横梁.第26分钟,奥塔门迪25码外漂亮的重炮轰门,贝戈维奇不敢怠慢将球打出.第27分钟,曼城前场高压逼迫对手传球失误,大卫-席尔瓦断球回做,费尔南迪尼奥精妙搓传,阿圭罗反越位成功头球冲顶破网,1-

给大家分享高手一些北京赛车PK10黑客改单,稳赢公式的规律技巧心得!

改单软件包赢qq2208391555依旧是梅西挺身而出 !苏牙做了该做的!都很漂亮!巴萨击破瓦伦大巴,梅西助攻苏神头破门拿下首回合,次回合苏神要还梅西助攻的,期待,不休息还怎么踢.马上开始欧冠,还轮休就轮休吧.让库蒂尼奥去发挥吧.这么踢,他肯定也会郁闷的.梅西把整个防守吸引到左侧,再传到远端,苏牙抓机会的能力,无出其右,裁判很公平,没有连续判2个点球,不然C罗怎么点球梅开二度,这样打,媒体又得说为啥巴萨吃不了点球,可对方倒是攻过来啊,不然怎么送点球啊,在对方门前送点?梅西在如此高密度的出场还能踢