【发布时间】:2017-08-03 21:39:11
【问题描述】:
给定下面的模型类:
from django.db import models
class User(models.Model):
friends = models.ManyToManyField('self', symmetrical=False, blank=True)
如果我有一个包含 n 个用户的 QuerySet,其中至少有一个有两个朋友,然后通过按朋友 ID 过滤该 QuerySet 来检索用户,并对该 QuerySet 执行.values_list() 调用,如下所示:
all_users = User.objects.all()
single_user = User.objects.filter(friends=2)
single_user.values_list('friends', flat=True)
输出结果如下:
>>> [2]
但如果我对对象的朋友字段本身执行相同的 .values_list 调用,如下所示:
single_user.first().friends.values_list('id', flat=True)
导致输出:
>>> [2, 3]
如果这些调用是在同一个对象上进行的,为什么输出不同?
作为参考,这是使用 Django 1.10 和 Python 3.5.2 实现的
编辑:我想澄清一些困惑。我的问题不是我误解了查询本身的结果。在这两种情况下,我最终都得到了正确的用户对象。不同之处在于,在一种情况下,我得到一个计数为 1 的 QuerySet,而在另一种情况下,我得到了 User 对象的实例。
所以换一种方式来陈述我的问题:我感到困惑的是,在 same 对象的不同表示上调用 values_list 如何导致不同的输出?
例如,我有以下查询集
<QuerySet [<User: John Doe, ID: 1]>
还有下面的对象,各有自己的变量
<User: John Doe, ID: 1>
如果我在同一个字段上执行 values_list,以必要的方式,我会得到两个不同的结果。我想解释一下为什么。对我来说,我觉得结果应该是一样的。既然不是,我对这些事情的运作方式有误解,正在寻求澄清。
【问题讨论】:
-
用户。修正错别字
-
举例说明一点。这个问题不是关于应该命名什么模型,而是关于查询集。不过感谢您的意见。
-
我选择了单数,希望能说明它是一个可迭代的。在我们的实际代码中,我们遵循您详细说明的准则。编辑了这个问题,主要是希望提高可读性。
-
这个问题最初是由于以下查询引发的:
User.objects.filter(friends=2).values_list('friends', flat=True)。我觉得这很重要,因为它消除了很多关于他如何得到不同结果的困惑。问题不在于 values 列表在同一个对象上给出了两个不同的结果,而是 values_list 直接与过滤器链接。标题中的问题与此事件有关,而不是显示的示例。
标签: python django django-queryset python-3.5