2021-04-02 一个简单的Python代码优化实例

本文介绍了一次代码优化的过程,主要针对IMUser类的get_object方法和build_rc_token静态方法。优化包括使用objects.create批量设置属性并减少不必要的数据库操作,以及调整build_rc_token方法仅负责生成token,不返回对象。通过这些改动,可以提高代码效率并降低数据库负载。
摘要由CSDN通过智能技术生成

代码优化

Git效果

     def get_object(self) -> IMUser:
         user_id = (member := self.request.member).imuser
         if not (obj := IMUser.normal.filter(user_id=user_id).first()):
-            obj = IMUser(
+            obj = IMUser.objects.create(
                 origin_id=member.id,
                 role=member.role,
                 nickname=member.nickname,
                 open_id=member.openid,
                 user_id=user_id,
+                phone=member.phone
             )
-        obj.phone = member.phone
-        obj.save()
-        return IMUserLoginOrCreate.build_rc_token(obj)
+        elif obj.phone != member.phone:
+            obj.phone = member.phone
+            obj.save()
+        self.build_rc_token(obj)
+        return obj

     @staticmethod
-    def build_rc_token(obj: IMUser) -> IMUser:
+    def build_rc_token(obj: IMUser) -> None:
         if not obj.im_token:
             res = RongUser.register(
-                obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
+                obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_uri
             )
             if res and res.get("code") == 200:
                 obj.im_token = res.get("token")
                 obj.save()
-        return obj

优化前的代码

class IMUserLoginOrCreate(generics.RetrieveUpdateAPIView):
    """
    get: 注册IM用户
    post: 修改用户
    """

    queryset = IMUser.normal.filter()
    serializer_class = IMUserSerializer

    def get_object(self) -> IMUser:
        user_id = (member := self.request.member).imuser
        if not (obj := IMUser.normal.filter(user_id=user_id).first()):
            obj = IMUser(
                origin_id=member.id,
                role=member.role,
                nickname=member.nickname,
                open_id=member.openid,
                user_id=user_id,
            )
        obj.phone = member.phone
        obj.save()
        return IMUserLoginOrCreate.build_rc_token(obj)

    @staticmethod
    def build_rc_token(obj: IMUser) -> IMUser:
        if not obj.im_token:
            res = RongUser.register(
                obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
            )
            if res and res.get("code") == 200:
                obj.im_token = res.get("token")
                obj.save()
        return obj

优化后的代码

class IMUserLoginOrCreate(generics.RetrieveUpdateAPIView):
    """
    get: 注册IM用户
    post: 修改用户
    """

    queryset = IMUser.normal.filter()
    serializer_class = IMUserSerializer

    def get_object(self) -> IMUser:
        user_id = (member := self.request.member).imuser
        if not (obj := IMUser.normal.filter(user_id=user_id).first()):
            obj = IMUser.objects.create(
                origin_id=member.id,
                role=member.role,
                nickname=member.nickname,
                open_id=member.openid,
                user_id=user_id,
                phone=member.phone
            )
        elif obj.phone != member.phone:
            obj.phone = member.phone
            obj.save()
        self.build_rc_token(obj)
        return obj

    @staticmethod
    def build_rc_token(obj: IMUser) -> None:
        if not obj.im_token:
            res = RongUser.register(
                obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_uri
            )
            if res and res.get("code") == 200:
                obj.im_token = res.get("token")
                obj.save()

优化原因:

  1. 应该判断phone是否有变化再决定是否save,数据库操作是很耗时的,尽量减少数据库操作
  2. build_rc_token顾名思义是用来创建token的,让它成为一个动作就好,不应返回obj;如果要返回obj应该换一个函数名

待优化:

  1. 不应使用GET来注册,应该用POST,然后PATCH或PUT来修改用户
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值