摘要:本文中討論的好友列表模型設(shè)計(jì)如下聊天用戶聊天用戶好友分組好友分組,備注信息,備注信息添加好友時(shí)間更新分組時(shí)間好友來源即和互為好友,在數(shù)據(jù)庫中只會(huì)保存一條記錄,這樣節(jié)省磁盤空間。
本文中討論的好友列表模型設(shè)計(jì)如下:
user_id = models.ForeignKey(ChatUserInfo, to_field="chat_id", on_delete=models.DO_NOTHING, db_index=True, help_text="聊天用戶id") friend_id = models.ForeignKey(ChatUserInfo, to_field="chat_id", related_name="friend", on_delete=models.DO_NOTHING, db_index=True, help_text="聊天用戶id") user_group = models.ForeignKey(ChatGroupType, to_field="flag", on_delete=models.CASCADE, help_text="好友分組") friend_group = models.ForeignKey(ChatGroupType, to_field="flag", related_name="friend_group", on_delete=models.CASCADE, help_text="好友分組") user_label = models.CharField(max_length=64,help_text="備注信息") friend_label = models.CharField(max_length=64,help_text="備注信息") create_time = models.DateTimeField("添加好友時(shí)間", auto_now_add=True) update_time = models.DateTimeField("更新分組時(shí)間", auto_now=True) resource = models.ForeignKey(ChatFriendResource, to_field="origin", on_delete=models.DO_NOTHING, help_text="好友來源")
即A和B互為好友,在數(shù)據(jù)庫中只會(huì)保存一條記錄,這樣節(jié)省磁盤空間。
對(duì)于這樣的模型,當(dāng)前端需要展示當(dāng)前用戶的好友列表時(shí),序列化方式如下:
views.py: def get(self, request, *args, **kwargs): """ 聊天-好友列表 :param request: :param args: :param kwargs: :return: """ try: chat_id = request.query_params.get("chat_id", "") # chat_id = request.user.user.chat_id # 添加用戶認(rèn)證后再使用request.user chat_user = models.ChatUserInfo.objects.get(chat_id=int(chat_id)) except ValueError: return Response(dict(msg="請(qǐng)輸入用戶id"), status=status.HTTP_400_BAD_REQUEST) except models.ChatUserInfo.DoesNotExist: return Response(dict(msg="用戶不存在"), status=status.HTTP_400_BAD_REQUEST) # 好友列表 user_friends = models.ChatFriendList.objects.filter(Q(user_id=chat_id) | Q(friend_id=chat_id)) ser = serializer.FriendSerializer(instance=user_friends, many=True, context={"chat_user": chat_user}) friends = [] for data in ser.data: friend_dict = OrderedDict() if data["user_id"] == int(chat_id): friend_dict["friend_id"] = data["friend_id"] friend_dict["friend_avatar"] = data["friend_avatar"] if data["friend_id"] == int(chat_id): friend_dict["friend_id"] = data["user_id"] friend_dict["friend_avatar"] = data["user_avatar"] friend_dict["friend_name"] = data["friend_name"] friend_dict["friend_area"] = data["friend_area"] friend_dict["friend_status"] = data["friend_status"] friend_dict["friend_label"] = data["friend_label"] friend_dict["friend_resource"] = data["friend_resource"] friends.append(friend_dict) logger.debug("data:%s", ser.data) return Response(dict(msg="OK", data=friends), status=status.HTTP_200_OK) serializer.py: class FriendSerializer(serializers.Serializer): """ 序列化-好友列表-好友信息 ChatFriendList """ # 用戶id # friend_id = serializers.SerializerMethodField(method_name="get_id") user_id = serializers.IntegerField(source="user.chat_id") friend_id = serializers.IntegerField(source="friend.chat_id") # 用戶昵稱 friend_name = serializers.SerializerMethodField(method_name="get_name") # 用戶頭像 # friend_avatar = serializers.SerializerMethodField(method_name="get_avatar") user_avatar = serializers.ImageField(source="user.user.avatar") friend_avatar = serializers.ImageField(source="friend.user.avatar") # 用戶地區(qū) friend_area = serializers.SerializerMethodField(method_name="get_area") # 用戶狀態(tài) friend_status = serializers.SerializerMethodField(method_name="get_status") # 用戶備注 friend_label = serializers.SerializerMethodField(method_name="get_label") # 用戶來源 friend_resource = serializers.CharField(source="resource") def get_id(self, obj): """ 獲取好友id :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend.chat_id return obj.user.chat_id def get_name(self, obj): """ 獲取好友昵稱 :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend.user.nickname return obj.user.user.nickname def get_avatar(self, obj): """ 獲取好友頭像 :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend.user.avatar return obj.user.user.avatar def get_area(self, obj): """ 獲取好友地區(qū) :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend.area return obj.user.area def get_status(self, obj): """ 獲取好友狀態(tài) :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend.status return obj.user.status def get_label(self, obj): """ 獲取好友備注 :param obj: :return: """ if obj.user.chat_id == self.context["chat_user"].chat_id: # user_id是當(dāng)前用戶 return obj.friend_label return obj.user_label def create(self, validated_data): pass def update(self, instance, validated_data): pass
上面的序列化主要使用了serializers.ImageField 和 serializers.SerializerMethodField,如有錯(cuò)誤之處,歡迎交流指正!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44745.html
摘要:本文中討論的好友列表模型設(shè)計(jì)如下聊天用戶聊天用戶好友分組好友分組,備注信息,備注信息添加好友時(shí)間更新分組時(shí)間好友來源即和互為好友,在數(shù)據(jù)庫中只會(huì)保存一條記錄,這樣節(jié)省磁盤空間。 本文中討論的好友列表模型設(shè)計(jì)如下: user_id = models.ForeignKey(ChatUserInfo, to_field=chat_id, on_delete=models.DO_NOTHING...
摘要:實(shí)戰(zhàn)小練習(xí)需求獲取指定組下的列表往用戶組添加用戶從組中刪除用戶需求分析獲取指定組下的列表網(wǎng)用戶組添加用戶從組中刪除用戶走界面不行項(xiàng)目結(jié)構(gòu)主路由配置文件開源運(yùn)維平臺(tái)子路由配置文件序列 實(shí)戰(zhàn)小練習(xí) 需求 users userGroups groups groupUsers---- get : 獲取指定組下的user列表-----put:往用戶組添加用戶-----delete:從組中刪除用...
摘要:今天整理了一下在項(xiàng)目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時(shí)使用和數(shù)據(jù)庫引擎你要存儲(chǔ)數(shù)據(jù)的庫名,事先要?jiǎng)?chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項(xiàng)目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:今天整理了一下在項(xiàng)目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時(shí)使用和數(shù)據(jù)庫引擎你要存儲(chǔ)數(shù)據(jù)的庫名,事先要?jiǎng)?chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項(xiàng)目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:基礎(chǔ)之二簡(jiǎn)介官方文檔安裝與配置安裝配置重新創(chuàng)建數(shù)據(jù)庫并配置新建一個(gè)的將座位,并做配置加入環(huán)境變量定義好主備路由主路由項(xiàng)目路由創(chuàng)建名稱地址聯(lián)系電話郵箱創(chuàng)建數(shù)據(jù)庫同步生成數(shù)據(jù)北京機(jī)房北京市酒仙橋北京機(jī)房上海機(jī)房上海上 DRF基礎(chǔ)之二 簡(jiǎn)介 官方文檔 Requirements REST framework requires the following: Python (2.7, 3.4, ...
閱讀 2024·2021-09-30 09:47
閱讀 703·2021-09-22 15:43
閱讀 1981·2019-08-30 15:52
閱讀 2431·2019-08-30 15:52
閱讀 2540·2019-08-30 15:44
閱讀 903·2019-08-30 11:10
閱讀 3372·2019-08-29 16:21
閱讀 3296·2019-08-29 12:19