Django中访问Model的related_name返回None问题排查
模型定义
# models.py 中User与Post的关联关系 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
视图执行代码
# views.py 的profile视图中执行的代码 print(User.objects.get(username=username).posts) print(Post.objects.filter(user = User.objects.get(username=username)))
输出结果
network.Post.None <QuerySet [<Post: Joe at 2022-12-18 10:48:18.941880+00:00: test1...>, <Post: Joe at 2022-12-18 10:53:27.407349+00:00: test1...>, <Post: Joe at 2022-12-18 10:53:34.167508+00:00: test2...>]>
疑问:为何第一条打印语句返回无数据,第二条却能得到预期的3条数据?我认为这两条语句应该实现相同的效果。
原因分析与解决方法
你看到的network.Post.None并不是真的没有数据,而是反向关联管理器的默认字符串表示。当你通过user.posts访问反向关联时,得到的是一个RelatedManager对象,直接打印它并不会触发数据库查询,所以显示的是管理器的默认标识,而非实际数据。
要获取关联的Post数据,需要调用管理器的查询方法(比如all())来执行数据库查询:
print(User.objects.get(username=username).posts.all())
而第二条语句Post.objects.filter(user=...)是直接构造了针对Post模型的查询,会立即执行数据库请求并返回包含数据的QuerySet,所以能直接看到结果。
另外,建议优化代码,避免重复查询用户对象:
user = User.objects.get(username=username) print(user.posts.all()) print(Post.objects.filter(user=user))
内容的提问来源于stack exchange,提问作者justjoelaw
相关产品推荐
相关产品推荐

