本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代码优化 Git效果
1 def get_object(self) -> IMUser:
2 user_id = (member := self.request.member).imuser
3 if not (obj := IMUser.normal.filter(user_id=user_id).first()):
4 - obj = IMUser(
5 + obj = IMUser.objects.create(
6 origin_id=member.id,
7 role=member.role,
8 nickname=member.nickname,
9 open_id=member.openid,
10 user_id=user_id,
11 + phone=member.phone
12 )
13 - obj.phone = member.phone
14 - obj.save()
15 - return IMUserLoginOrCreate.build_rc_token(obj)
16 + elif obj.phone != member.phone:
17 + obj.phone = member.phone
18 + obj.save()
19 + self.build_rc_token(obj)
20 + return obj
21 @staticmethod
22 - def build_rc_token(obj: IMUser) -> IMUser:
23 + def build_rc_token(obj: IMUser) -> None:
24 if not obj.im_token:
25 res = RongUser.register(
26 - obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
27 + obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_uri
28 )
29 if res and res.get("code") == 200:
30 obj.im_token = res.get("token")
31 obj.save()
32 - return obj
优化前的代码
1 class IMUserLoginOrCreate(generics.RetrieveUpdateAPIView):
2 """
3 get: 注册IM用户
4 post: 修改用户
5 """
6
7 queryset = IMUser.normal.filter()
8 serializer_class = IMUserSerializer
10
11 def get_object(self) -> IMUser:
12 user_id = (member := self.request.member).imuser
13 if not (obj := IMUser.normal.filter(user_id=user_id).first()):
14 obj = IMUser(
15 origin_id=member.id,
16 role=member.role,
17 nickname=member.nickname,
18 open_id=member.openid,
19 user_id=user_id,
20 )
21 obj.phone = member.phone
22 obj.save()
23 return IMUserLoginOrCreate.build_rc_token(obj)
24
25 @staticmethod
26 def build_rc_token(obj: IMUser) -> IMUser:
27 if not obj.im_token:
28 res = RongUser.register(
29 obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
30 )
31 if res and res.get("code") == 200:
32 obj.im_token = res.get("token")
33 obj.save()
34 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()
优化原因:
应该判断phone是否有变化再决定是否save,数据库操作是很耗时的,尽量减少数据库操作 build_rc_token顾名思义是用来创建token的,让它成为一个动作就好,不应返回obj;如果要返回obj应该换一个函数名 待优化:
不应使用GET来注册,应该用POST,然后PATCH或PUT来修改用户