资讯专栏INFORMATION COLUMN

在django开发中,使用drf序列化好友列表

fish / 2915人阅读

摘要:本文中讨论的好友列表模型设计如下聊天用户聊天用户好友分组好友分组,备注信息,备注信息添加好友时间更新分组时间好友来源即和互为好友,在数据库中只会保存一条记录,这样节省磁盘空间。

本文中讨论的好友列表模型设计如下:

</>复制代码

  1. user_id = models.ForeignKey(ChatUserInfo, to_field="chat_id", on_delete=models.DO_NOTHING, db_index=True, help_text="聊天用户id")
  2. friend_id = models.ForeignKey(ChatUserInfo, to_field="chat_id", related_name="friend", on_delete=models.DO_NOTHING, db_index=True, help_text="聊天用户id")
  3. user_group = models.ForeignKey(ChatGroupType, to_field="flag", on_delete=models.CASCADE, help_text="好友分组")
  4. friend_group = models.ForeignKey(ChatGroupType, to_field="flag", related_name="friend_group", on_delete=models.CASCADE, help_text="好友分组")
  5. user_label = models.CharField(max_length=64,help_text="备注信息")
  6. friend_label = models.CharField(max_length=64,help_text="备注信息")
  7. create_time = models.DateTimeField("添加好友时间", auto_now_add=True)
  8. update_time = models.DateTimeField("更新分组时间", auto_now=True)
  9. resource = models.ForeignKey(ChatFriendResource, to_field="origin", on_delete=models.DO_NOTHING, help_text="好友来源")

即A和B互为好友,在数据库中只会保存一条记录,这样节省磁盘空间。

对于这样的模型,当前端需要展示当前用户的好友列表时,序列化方式如下:

</>复制代码

  1. views.py:
  2. def get(self, request, *args, **kwargs):
  3. """
  4. 聊天-好友列表
  5. :param request:
  6. :param args:
  7. :param kwargs:
  8. :return:
  9. """
  10. try:
  11. chat_id = request.query_params.get("chat_id", "")
  12. # chat_id = request.user.user.chat_id # 添加用户认证后再使用request.user
  13. chat_user = models.ChatUserInfo.objects.get(chat_id=int(chat_id))
  14. except ValueError:
  15. return Response(dict(msg="请输入用户id"), status=status.HTTP_400_BAD_REQUEST)
  16. except models.ChatUserInfo.DoesNotExist:
  17. return Response(dict(msg="用户不存在"), status=status.HTTP_400_BAD_REQUEST)
  18. # 好友列表
  19. user_friends = models.ChatFriendList.objects.filter(Q(user_id=chat_id) | Q(friend_id=chat_id))
  20. ser = serializer.FriendSerializer(instance=user_friends, many=True, context={"chat_user": chat_user})
  21. friends = []
  22. for data in ser.data:
  23. friend_dict = OrderedDict()
  24. if data["user_id"] == int(chat_id):
  25. friend_dict["friend_id"] = data["friend_id"]
  26. friend_dict["friend_avatar"] = data["friend_avatar"]
  27. if data["friend_id"] == int(chat_id):
  28. friend_dict["friend_id"] = data["user_id"]
  29. friend_dict["friend_avatar"] = data["user_avatar"]
  30. friend_dict["friend_name"] = data["friend_name"]
  31. friend_dict["friend_area"] = data["friend_area"]
  32. friend_dict["friend_status"] = data["friend_status"]
  33. friend_dict["friend_label"] = data["friend_label"]
  34. friend_dict["friend_resource"] = data["friend_resource"]
  35. friends.append(friend_dict)
  36. logger.debug("data:%s", ser.data)
  37. return Response(dict(msg="OK", data=friends), status=status.HTTP_200_OK)
  38. serializer.py:
  39. class FriendSerializer(serializers.Serializer):
  40. """
  41. 序列化-好友列表-好友信息 ChatFriendList
  42. """
  43. # 用户id
  44. # friend_id = serializers.SerializerMethodField(method_name="get_id")
  45. user_id = serializers.IntegerField(source="user.chat_id")
  46. friend_id = serializers.IntegerField(source="friend.chat_id")
  47. # 用户昵称
  48. friend_name = serializers.SerializerMethodField(method_name="get_name")
  49. # 用户头像
  50. # friend_avatar = serializers.SerializerMethodField(method_name="get_avatar")
  51. user_avatar = serializers.ImageField(source="user.user.avatar")
  52. friend_avatar = serializers.ImageField(source="friend.user.avatar")
  53. # 用户地区
  54. friend_area = serializers.SerializerMethodField(method_name="get_area")
  55. # 用户状态
  56. friend_status = serializers.SerializerMethodField(method_name="get_status")
  57. # 用户备注
  58. friend_label = serializers.SerializerMethodField(method_name="get_label")
  59. # 用户来源
  60. friend_resource = serializers.CharField(source="resource")
  61. def get_id(self, obj):
  62. """
  63. 获取好友id
  64. :param obj:
  65. :return:
  66. """
  67. if obj.user.chat_id == self.context["chat_user"].chat_id:
  68. # user_id是当前用户
  69. return obj.friend.chat_id
  70. return obj.user.chat_id
  71. def get_name(self, obj):
  72. """
  73. 获取好友昵称
  74. :param obj:
  75. :return:
  76. """
  77. if obj.user.chat_id == self.context["chat_user"].chat_id:
  78. # user_id是当前用户
  79. return obj.friend.user.nickname
  80. return obj.user.user.nickname
  81. def get_avatar(self, obj):
  82. """
  83. 获取好友头像
  84. :param obj:
  85. :return:
  86. """
  87. if obj.user.chat_id == self.context["chat_user"].chat_id:
  88. # user_id是当前用户
  89. return obj.friend.user.avatar
  90. return obj.user.user.avatar
  91. def get_area(self, obj):
  92. """
  93. 获取好友地区
  94. :param obj:
  95. :return:
  96. """
  97. if obj.user.chat_id == self.context["chat_user"].chat_id:
  98. # user_id是当前用户
  99. return obj.friend.area
  100. return obj.user.area
  101. def get_status(self, obj):
  102. """
  103. 获取好友状态
  104. :param obj:
  105. :return:
  106. """
  107. if obj.user.chat_id == self.context["chat_user"].chat_id:
  108. # user_id是当前用户
  109. return obj.friend.status
  110. return obj.user.status
  111. def get_label(self, obj):
  112. """
  113. 获取好友备注
  114. :param obj:
  115. :return:
  116. """
  117. if obj.user.chat_id == self.context["chat_user"].chat_id:
  118. # user_id是当前用户
  119. return obj.friend_label
  120. return obj.user_label
  121. def create(self, validated_data):
  122. pass
  123. def update(self, instance, validated_data):
  124. pass

上面的序列化主要使用了serializers.ImageField 和 serializers.SerializerMethodField,如有错误之处,欢迎交流指正!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44745.html

相关文章

  • django开发使用drf列化好友列表

    摘要:本文中讨论的好友列表模型设计如下聊天用户聊天用户好友分组好友分组,备注信息,备注信息添加好友时间更新分组时间好友来源即和互为好友,在数据库中只会保存一条记录,这样节省磁盘空间。 本文中讨论的好友列表模型设计如下: user_id = models.ForeignKey(ChatUserInfo, to_field=chat_id, on_delete=models.DO_NOTHING...

    894974231 评论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条评论

fish

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<