Does Django queryset values_list return a list object?

匆匆过客 提交于 2019-11-28 07:00:12

问题


I have a Django app where users post photos, and other leave comments under the photos.

When a comment is left, I need to notify:

  1. Everyone else who wrote in this thread
  2. The owner of the photo, in case they're not included in (1)

For (1), I do:

#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]

Next, for (2), I try:

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

I end up with an error:

'ValuesListQuerySet' object has no attribute 'append'

I find this strange, because I'm extracting a values_list.

Isn't that a list object, and in that case, shouldn't the attribute append work in this scenario? Please explain what's wrong, and suggest alternatives.


回答1:


The values_list method returns a ValuesListQuerySet. This means it has the advantages of a queryset. For example it is lazy, so you only fetch the first 25 elements from the database when you slice it.

To convert it to a list, use 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)

You might be able to start the queryset from your User model instead of using values_list. You haven't shown your models, so the following code is a guess:

from django.db.models import Q

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


来源:https://stackoverflow.com/questions/37140426/does-django-queryset-values-list-return-a-list-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!