国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在django開發中,使用drf序列化好友列表

894974231 / 1015人閱讀

摘要:本文中討論的好友列表模型設計如下聊天用戶聊天用戶好友分組好友分組,備注信息,備注信息添加好友時間更新分組時間好友來源即和互為好友,在數據庫中只會保存一條記錄,這樣節省磁盤空間。

本文中討論的好友列表模型設計如下:

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("添加好友時間", auto_now_add=True)
update_time = models.DateTimeField("更新分組時間", auto_now=True)
resource = models.ForeignKey(ChatFriendResource, to_field="origin", on_delete=models.DO_NOTHING, help_text="好友來源")

即A和B互為好友,在數據庫中只會保存一條記錄,這樣節省磁盤空間。

對于這樣的模型,當前端需要展示當前用戶的好友列表時,序列化方式如下:

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  # 添加用戶認證后再使用request.user
        chat_user = models.ChatUserInfo.objects.get(chat_id=int(chat_id))
    except ValueError:
        return Response(dict(msg="請輸入用戶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")
    # 用戶地區
    friend_area = serializers.SerializerMethodField(method_name="get_area")
    # 用戶狀態
    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是當前用戶
            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是當前用戶
            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是當前用戶
            return obj.friend.user.avatar
        return obj.user.user.avatar

    def get_area(self, obj):
        """
        獲取好友地區
        :param obj:
        :return:
        """
        if obj.user.chat_id == self.context["chat_user"].chat_id:
            # user_id是當前用戶
            return obj.friend.area
        return obj.user.area

    def get_status(self, obj):
        """
        獲取好友狀態
        :param obj:
        :return:
        """
        if obj.user.chat_id == self.context["chat_user"].chat_id:
            # user_id是當前用戶
            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是當前用戶
            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,如有錯誤之處,歡迎交流指正!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45461.html

相關文章

  • django開發使用drf列化好友列表

    摘要:本文中討論的好友列表模型設計如下聊天用戶聊天用戶好友分組好友分組,備注信息,備注信息添加好友時間更新分組時間好友來源即和互為好友,在數據庫中只會保存一條記錄,這樣節省磁盤空間。 本文中討論的好友列表模型設計如下: user_id = models.ForeignKey(ChatUserInfo, to_field=chat_id, on_delete=models.DO_NOTHING...

    fish 評論0 收藏0
  • Django基礎之(十二) DRF綜合小練習

    摘要:實戰小練習需求獲取指定組下的列表往用戶組添加用戶從組中刪除用戶需求分析獲取指定組下的列表網用戶組添加用戶從組中刪除用戶走界面不行項目結構主路由配置文件開源運維平臺子路由配置文件序列 實戰小練習 需求 users userGroups groups groupUsers---- get : 獲取指定組下的user列表-----put:往用戶組添加用戶-----delete:從組中刪除用...

    lemon 評論0 收藏0
  • django開發-mongodb的配置與使用

    摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用 今天整理了一下在django項目中如何使用mongodb, 環境如下:ubuntu18.04, django2.0.5, drf3.9, mong...

    appetizerio 評論0 收藏0
  • django開發-mongodb的配置與使用

    摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用 今天整理了一下在django項目中如何使用mongodb, 環境如下:ubuntu18.04, django2.0.5, drf3.9, mong...

    masturbator 評論0 收藏0
  • Django基礎之(十)DRF

    摘要:基礎之二簡介官方文檔安裝與配置安裝配置重新創建數據庫并配置新建一個的將座位,并做配置加入環境變量定義好主備路由主路由項目路由創建名稱地址聯系電話郵箱創建數據庫同步生成數據北京機房北京市酒仙橋北京機房上海機房上海上 DRF基礎之二 簡介 官方文檔 Requirements REST framework requires the following: Python (2.7, 3.4, ...

    eccozhou 評論0 收藏0

發表評論

0條評論

894974231

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<