如何序列化带多对多关系的模型并返回关联用户列表
解决方案
self.likes.all() 返回的是Django ORM的QuerySet对象,不属于JSON可序列化的Python原生数据类型,你需要遍历QuerySet把其中的User实例转换成可序列化的结构即可,同时直接移除likes_number字段就行。
根据你需要返回的用户信息粒度,有两种常见写法:
- 如果只需要返回点赞用户的用户名,直接用列表推导式提取字段即可,修改后的代码如下:
def serialize(self): return { 'id': self.id, 'author': self.author.username, 'text': self.text, 'timestamp': self.timestamp.strftime("%b %d %Y, %I:%M %p"), 'likes': [user.username for user in self.likes.all()], }
- 如果需要返回点赞用户的多个属性(比如用户ID、昵称、头像链接等),就在遍历的时候为每个用户生成对应的结构化字典:
def serialize(self): return { 'id': self.id, 'author': self.author.username, 'text': self.text, 'timestamp': self.timestamp.strftime("%b %d %Y, %I:%M %p"), 'likes': [ { "id": user.id, "username": user.username, # 此处按需添加你需要返回的User模型字段即可 } for user in self.likes.all() ], }
优化提示:这种写法只需要一次查询就能拿到所有点赞用户数据,比你之前两次调用
self.likes.all()的效率更高。如果后续需要用到点赞总数,直接对返回的likes列表取len()就能得到,不需要额外查询数据库。
内容的提问来源于stack exchange,提问作者Giuliano Mirabella
相关产品推荐
相关产品推荐

