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

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

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

  1. 在此线程中写过文章的其他人
  2. 照片的所有者,以防他们不包括在 (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 不应该在这种情况下工作吗?请说明问题所在,并提出替代方案。

【问题讨论】:

    标签: django django-models django-orm


    【解决方案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。
    • 对我来说,这似乎是一个名字不好的方法,难怪有这么多的混乱。
    猜你喜欢
    • 2012-01-25
    • 2011-09-18
    • 2011-07-09
    • 2014-08-04
    • 2014-01-27
    • 1970-01-01
    • 2011-11-27
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多