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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

618閲覧

django、店舗一覧(ListView)画面で、都道府県(ForeignKey)とタグ(ManyToManyField)で絞り込んだ数を表示したい

hiranohirano

総合スコア33

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2019/06/22 12:03

##やりたい事
都道府県ごとの店舗一覧リストを作りました。
その中に、タグ機能を付けました。
都道府県+タグで絞り込まれた店舗の数を表示したいです。

イメージはこちらのようなものです。
一覧ページがあって、ページ左側にタグ(人気のこだわり条件)があって、タグの右側に数字が書かれています。

###書いたコード

urls.py

python

1 2urlpatterns = [ 3 //省略// 4 path('<str:prefecture>/store-list/tag/<int:tag_id>/', PrefectureStoreList.as_view(), name='prefecture_tag'), 5 path('<str:prefecture>/store-list/', PrefectureStoreList.as_view(), name='prefecture'), 6 //省略// 7]

以下のように、店舗と都道府県はForeignKeyで、店舗とタグはManyToManyFieldでつないでいます。
(都道府県の下に市区町村モデルなどもありますが、不要そうなところは、省略してあります。)

models.py

class Prefecture(models.Model): name = models.CharField(verbose_name='都道府県名', max_length=20) url_name = models.CharField(verbose_name='URL用都道府県名', max_length=20) def __str__(self): return self.name class Meta: verbose_name = '都道府県名' verbose_name_plural = '都道府県名' ordering = ['pk'] class Store(models.Model): name = models.CharField(verbose_name='店舗名', max_length=100) prefecture = models.ForeignKey( Prefecture, verbose_name='県名', on_delete=models.PROTECT,) tags = models.ManyToManyField(Tag, verbose_name='タグ', blank=True) //省略// class Tag(models.Model): name = models.CharField(verbose_name='タグ名', max_length=20) def __str__(self): return self.name class Meta: verbose_name = 'タグ' verbose_name_plural = 'タグ'

店舗一覧画面のビューは、以下の通りです。
views.py

class PrefectureStoreList(ListView): model = Store template_name = 'myapp/prefecture_list.html' paginate_by = 10 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) prefecture = self.kwargs.get('prefecture') context['prefecture'] = Prefecture.objects.get(url_name=prefecture) context['tags'] = Tag.objects.all() return context def get_queryset(self): queryset = super().get_queryset() prefecture = self.kwargs.get('prefecture') tags = self.kwargs.get('tag_id') queryset = queryset.filter(prefecture__url_name=prefecture) if tags: queryset = queryset.filter(tags=tags) return queryset

get_querysetを上書きし、全ての店舗一覧から、特定の都道府県の店舗に絞り込んでいます。
また、アクセスしたURLの中にtag_idがあれば、そのタグの条件に合った店舗に絞り込んでいます。

/tokyo/store-list/にアクセスすると、東京の店舗一覧が表示されます。
/tokyo/store-list/tag/1にアクセスすると、東京のタグ1の特性を持った店舗一覧が表示されます。

ここまでは何の問題もありません。

prefecture_list.html

html

1(不要そうなので省略) 2<!--左側のタグを特定する箇所--> 3<h4 class="side-headline">タグから探す</h4> 4<ul class="side-ul"> 5 {% for tag in tags %} 6 {% if tag.store_set.count > 0 %} 7 <li><a href="{% url 'myapp:prefecture_tag' prefecture.url_name tag.pk %}">{{tag}}({{tag.store_set.count}})</a></li> 8 {% endif %} 9 {% endfor %} 10</ul> 11(不要そうなので省略)

エラー・わからないこと

{{tag.store_set.count}}としているところが期待通りに動きません。

◆自分の期待している結果
/tokyo/store-list/にアクセスをした時に、
{{tag.store_set.count}}の結果として、東京にあって、かつ、タグ1の条件を持つ店舗数を表示したい。
◆予期せず返ってくる値
タグ1の条件を持った、全国の店舗数が返ってくる。

{{prefecture.store_set.count}}は東京にある全ての店舗が返ってきてしまいます。

自分の期待している結果を得るためには、どのようにすれば良いのでしょうか?
タグ1の特性を持った東京の店舗だけであれば、ビューの中で絞り込めそうですが、
{% for tag in tags %}の中の、tagそれぞれにあった店舗数を絞りこみたいので、少し難しいです。

お分かりになる方、アドバイスいただけましたら幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

view.pyの中で、annotate()を使って解決しました!
ドキュメントはこちらですが、
こちらの記事がわかりやすかったです。

投稿2019/06/25 02:32

hiranohirano

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問