質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

811閲覧

Django、QuerySet内の重複が消えない

namnium1125

総合スコア2043

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/29 06:29

いつもお世話になっております。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

誤り↓

python3

1photos.distinct()

解決法↓

python3

1photos = photos.distinct()

すみませんアホでした...m(_ _)m

投稿2018/09/29 07:15

namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問