web-dev-qa-db-ja.com

Django queryset values_listはリストオブジェクトを返しますか?

Djangoアプリがあり、ユーザーが写真を投稿したり、他の写真の下にコメントを残したりします。

コメントが残されたら、通知する必要があります:

  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」オブジェクトには「append」属性がありません

values_listを抽出しているので、これは奇妙だと思います。

それはリストオブジェクトではなく、その場合、属性appendはこのシナリオでは機能しませんか?何が悪いのかを説明し、代替案を提案してください。

16
Hassan Baig

_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)
_

_values_list_を使用する代わりに、Userモデルからクエリセットを開始できる場合があります。モデルを表示していないので、次のコードは推測です。

_from Django.db.models import Q

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