web-dev-qa-db-fra.com

Django queryset values_list renvoie-t-il un objet liste?

J'ai une application Django où les utilisateurs publient des photos et d'autres laissent des commentaires sous les photos.

Lorsqu'un commentaire est laissé, je dois informer:

  1. Tous ceux qui ont écrit dans ce fil
  2. Le propriétaire de la photo, au cas où ils ne seraient pas inclus dans (1)

Pour (1), je fais:

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

Ensuite, pour (2), j'essaye:

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

Je me retrouve avec une erreur:

L'objet 'ValuesListQuerySet' n'a pas d'attribut 'append'

Je trouve cela étrange, car j'extrait un values_list.

N'est-ce pas un objet liste, et dans ce cas, l'attribut append ne devrait-il pas fonctionner dans ce scénario? Veuillez expliquer ce qui ne va pas et suggérer des alternatives.

16
Hassan Baig

La méthode values_list Renvoie un ValuesListQuerySet. Cela signifie qu'il présente les avantages d'un ensemble de requêtes. Par exemple, il est paresseux, donc vous ne récupérez les 25 premiers éléments de la base de données que lorsque vous le découpez.

Pour le convertir en liste, utilisez 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)

Vous pourrez peut-être démarrer le jeu de requêtes à partir de votre modèle User au lieu d'utiliser values_list. Vous n'avez pas montré vos modèles, le code suivant est donc une supposition:

from Django.db.models import Q

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