Django queryset values_list 是不是返回一个列表对象?

Posted

技术标签:

【中文标题】Django queryset values_list 是不是返回一个列表对象?【英文标题】:Does Django queryset values_list return a list object?Django queryset values_list 是否返回一个列表对象? 【发布时间】:2016-09-05 13:03:00 【问题描述】:

我有一个 Django 应用程序,用户可以在其中发布照片,而其他人则在照片下留下 cmets。

当有评论时,我需要通知:

    在此线程中写过文章的其他人 照片的所有者,以防他们不包括在 (1) 中

对于(1),我愿意:

#I slice by 25 because I arbitrarily deem anyone beyond that irrelevant. 
all_commenter_ids = PhotoComment.objects.filter(which_photo=which_photo).order_by('-id').values_list('submitted_by', flat=True)[:25]

接下来,对于(2),我尝试:

all_relevant_ids = all_commenter_ids.append(which_photo.owner_id)
all_relevant_ids = list(set(all_relevant_ids))

我最终得到一个错误:

“ValuesListQuerySet”对象没有“附加”属性

我觉得这很奇怪,因为我正在提取 values_list

那不是一个列表对象吗?在这种情况下,属性append 不应该在这种情况下工作吗?请说明问题所在,并提出替代方案。

【问题讨论】:

【参考方案1】:

values_list 方法返回一个ValuesListQuerySet。这意味着它具有查询集的优点。例如它是惰性的,所以当你对它进行切片时,你只从数据库中获取前 25 个元素。

要将其转换为列表,请使用list()

all_commenter_ids = PhotoComment.objects.filter(which_photo=which_photo).order_by('-id').values_list('submitted_by', flat=True)[:25]
all_commenter_ids = list(all_commenter_ids)

您也许可以从 User 模型而不是使用 values_list 启动查询集。你还没有展示你的模型,所以下面的代码是一个猜测:

from django.db.models import Q

commenters = User.objects.filter(Q(id=which_photo.owner_id)|Q(photocomment=which_photo))

【讨论】:

嗯,我在应用您的修复后发布第一条评论时,我在all_relevant_ids = list(set(all_relevant_ids)) 线上收到了'NoneType' object is not iterable。我需要深入研究一下。 请注意append 方法返回None。您只需要all_commenter_ids.append(which_photo.owner_id) - 不要将结果分配给all_relevant_ids 顺便说一句,我是否也应该将我正在接受的 values_list 切片包含在set 中,因为某些 id 可能会重复?回复:用户对象路由,照片评论不是用户的一部分,因此不能这样做。不过感谢您的建议。 是否切片由您决定。由于您在结果上调用 set(),因此最终列表中的条目可能少于 25 个。如果您需要 25 个项目,那么您可能需要转换为一个集合,然后转换回一个列表,然后切片。但是,这将从数据库中获取所有 id,这可能会很慢。我不确定如何使用 ORM 获得前 25 个唯一 ID。 对我来说,这似乎是一个名字不好的方法,难怪有这么多的混乱。

以上是关于Django queryset values_list 是不是返回一个列表对象?的主要内容,如果未能解决你的问题,请参考以下文章

DJango filter_queryset

Django - 如何将 QuerySet 转换为 Q 对象?

django的queryset和objects对象

Django--QuerySet

QuerySet,对象没有属性 id - Django

如何在 Django 中覆盖“get_queryset()”