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 是不是返回一个列表对象?的主要内容,如果未能解决你的问题,请参考以下文章