[Django] QuerySetをマージして一つにする方法

下記サンプルではTwitterのタイムラインの様に自分とフォローしているユーザーのツイートを取得する方法です。
自分のアカウントとフォローしているユーザーのアカウントをQuerySetで取得してTweetモデルにwherer_inで渡すことでTweetを取得する流れです。

# chainを使ってマージします。
from itertools import chain

# IDから自ユーザーをQuerySetオブジェクトで取得します。
user = CustomUser.objects.filter(id=self.id)

# 自ユーザーがフォローしているユーザーをQuerySetオブジェクトで取得します。
followings = self.followings.values_list("id", flat=True)

# 失敗例 followings += user これはエラーが出ます。
# chainを使って上記で取得したQuerySetオブジェクトをマージします。
result_list = list(chain(user, followings))

# Tweetのモデルを呼び出します。
tweet_model = apps.get_model('tweets', 'Tweet')

# result_listを引数で渡してポストを取得します。
tweets = tweet_model.objects.filter(user__in=result_list).order_by('-created_at')

# ポストを返す
return tweets

この方法で取得した後は、template側でいつものQuerySetの様に”user.tweet.content”で値を取得することができます。

タイトルとURLをコピーしました