いつもお世話になっております。
querysetから、下記のようなコードを通して目的のデータを抽出したいと思っているのですが、同じデータを複数回取ってくることがあり、photos内にて重複が消えず困っております。
python3
1def get_photos_with_filter(self, form): 2 # assert form.is_valid() 3 target_method = form.cleaned_data["target_method"] 4 photos = self.model.objects 5 if target_method == "genres": 6 genres = form.cleaned_data["genres"].replace("\n", ",") 7 genres = re.split(r"\s?,\s?", genres) 8 if genres: 9 photos = photos.filter(genre__in=genres) 10 elif target_method == "account_names": 11 account_names = form.cleaned_data["account_names"].split("\n") 12 if account_names: 13 account_names = list(map(account_name_filter, account_names)) 14 photos = photos.filter(album__name__in=account_names) 15 16# 問題個所はおそらくここから↓ 17 18 keywords = re.split(r"\s?,\s?", form.cleaned_data["keywords"]) 19 if keywords: 20 qs_lis = [] 21 for keyword_set in keywords: 22 qs = photos 23 for keyword in re.split(r"\s?+\s?", keyword_set): 24 qs = qs.filter(comment__text__icontains=keyword) 25 qs_lis.append(qs) 26 photos = reduce(lambda p, q: p | q, qs_lis) 27 28 post_date_filter = form.cleaned_data["post_date_filter"] 29 if post_date_filter: 30 photos = photos.filter(post_dt__gte=post_date_filter) 31 32 photos.distinct() # <- distinctを掛けても消えない 33
処理自体については、写真とそれに結びついたコメントから対象のデータを取ってくる、というもので、キーワード検索において、and検索とor検索を同時にできたらなと思い、+
(プラス)でAND、,
(カンマ)でORとなるようにしたつもりです。(ANDが優先です。)
そのあたりはともかく(このロジックも変なところがありましたらご指摘くださると幸いですが、とりあえず本題ではないです)、実行すると同じデータを取ってくることがあり、この重複を消したいのですが、なぜか消えてくれないです。
querysetを出力させると明らかに同じデータがあることが確認でき、だからSQL関連の関数distinct
では消すことができないのかな等考えましたが、調べても解決方法がよくわかりませんでした。
自前で以下のようなコードを実行したいと思ったのですが(pop
はattributeエラーになります。以下のコードはやりたいことと考えてください。)、distinct
以外で良い関数等既にあるのでしょうか?
何かわかる方がいらっしゃったら、教えていただけると幸いです。
python3
1for i, p in enumerate(photos): 2 for q in photos[:i] + photos[i+1:]: 3 if p == q: # 実際、Trueになることがあった 4 photos.pop(i)
わかりにくい質問文ですみません、、必要な情報があれば適宜追記します。よろしくお願いします。m(_ _)m
バージョン
python: Python 3.6.4 :: Anaconda, Inc.
Django: 2.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。