首页 > 解决方案 > QuerySet.values('field_name') 只返回 id

问题描述

我有一个名为的模型Comment,它有另一个模型Post作为外键。它还与用户模型有多对多的关系。

In [136]: user            = User.get(pk=1)
In [137]: all_comments    = Comment.objects.all()
In [138]: seen_comments   = user.seen_comments.all()
In [139]: unseen_comments = all_comments.difference(seen_comments)

这是查询集的结构:

In [140]: all_comments                                                                                                                                                                                                        
Out[140]: <QuerySet [<Comment: Test comment>, <Comment: Test comment 2>, <Comment: Test comment 3>]>

In [141]: all_comments.values()                                                                                                                                                                                               
Out[141]: <QuerySet [{'id': 17, 'post_id': 44, 'text': 'Test comment', 'created_date': datetime.datetime(2018, 12, 18, 7, 0, tzinfo=<UTC>), 'user_id': 1}, {'id': 19, 'post_id': 44, 'text': 'Test comment 2', 'created_date': datetime.datetime(2018, 12, 19, 9, 0, tzinfo=<UTC>), 'user_id': 20}, {'id': 20, 'post_id': 44, 'text': 'Test comment 3', 'created_date': datetime.datetime(2018, 12, 27, 8, 12, 27, 338467, tzinfo=<UTC>), 'user_id': 1}]>

unseen_comments 是 Comment 对象的 QuerySet。

In [142]: unseen_comments                                                                                                                                                                                          
Out[142]: <QuerySet [<Comment: Test comment>, <Comment: Test comment 3>]>

In [143]: unseen_comments.values()                                                                                                                                                                                 
Out[143]: <QuerySet [{'id': 17, 'post_id': 44, 'text': 'Test comment', 'created_date': datetime.datetime(2018, 12, 18, 7, 0, tzinfo=<UTC>), 'user_id': 1}, {'id': 20, 'post_id': 44, 'text': 'Test comment 2', 'created_date': datetime.datetime(2018, 12, 27, 8, 12, 27, 338467, tzinfo=<UTC>), 'user_id': 1}]>

现在,如果我尝试获取所有看不见的帖子的 id,我会得到:

In [144]: unseen_comments.values('post_id')                                                                                                                                                                     
Out[144]: <QuerySet [{'post_id': 17}, {'post_id': 20}]>

这是错误的。我预计它在这两种情况下都会返回 44。

同样,如果我尝试获取我得到的每条评论的文本:

In [145]: unseen_comments.values('text')                                                                                                                                                                           
Out[145]: <QuerySet [{'text': 17}, {'text': 20}]>

如果我做同样的事情,但使用原始评论 QuerySet 我会得到预期的结果。

In [146]: all_comments.values('post_id')                                                                                                                                                                                   
Out[146]: <QuerySet [{'post_id': 44}, {'post_id': 44}, {'post_id': 44}]>

我的问题是,为什么没有unseen_comments.values('post_id')预期的结果?

标签: djangodjango-queryset

解决方案


推荐阅读