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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

663閲覧

Django クエリセット でカテゴリの取得方法

Mario_11

総合スコア95

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2020/08/13 23:45

Django クエリセット でカテゴリの重複なしの名前と番号の取得方法を教えていただきたいです。

python

1class Item(models.Model): 2 3 CATEGORY = [ 4 (1, '和食・日本料理'), 5 (2, 'アジアン'), 6 (3, '中華'), 7 (4, 'イタリアン'), 8 (5, 'フレンチ'), 9 (6, '洋食・西洋料理'), 10 (7, 'その他'), 11 ] 12 category = models.IntegerField(verbose_name='カテゴリ',choices=CATEGORY, null=True, blank=True,) 13 title = models.CharField('タイトル', max_length=70, null=True)

上記のようなカテゴリ一覧をviewで重複なしの名前と番号を取得したいのですが、うまくいかず質問させていただきました。
番号が欲しい理由はカテゴリをクリックしたときに、TagsPostListViewでそのカテゴリの投稿一覧を表示させたいからです。

python

1#views.py 2class TagsView(View): 3 """リスト一覧""" 4 def get(self, request, *args, **kwargs): 5 context = {} 6#① 7 context['item_all'] = Item.objects.distinct() 8#② 9 context['item'] = Item.objects.values_list('category', flat=True).distinct() 10#③ 11 lst = [p.get_category_display() for p in Item.objects.order_by('-category').distinct()] 12 13 14class TagsPostListView(View): 15 """関連リスト""" 16 def get(self, request,*args, **kwargs): 17 # getパラメーターのtag=, category=の部分を取得 18 tag = request.GET.get('tag') 19 category = request.GET.get('category') 20 21 context = {} 22 context['tag'] = tag 23 context['category'] = category 24 25 context['all_tag_post_list'] = Item.objects.filter(tags__name__in=[tag]).distinct() 26 context['all_item_category_post_list'] = Item.objects.filter(category=category).distinct() 27 return render(request, 'app/tag_post_list.html', context) 28 29

①を実行すると、番号と名前を取得できますがカテゴリが重複してしまいます。
②を実行すると、番号を取得でき、カテゴリの重複もないですが、カテゴリ名が取得できません。
③を実行すると、名前は取得できるのですが、カテゴリが重複してしまい、番号が取得できません。

どうしたら、重複なしでカテゴリ名前とカテゴリ番号を取得できるのでしょうか。
アドバイスいただきたいです。
よろしくお願いいたします。

Django Version: 2.2
Python Version: 3.8.2

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

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

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

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

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

t_obara

2020/08/14 07:53

全体の構成がよく理解できていないですが、単に重複無しで番号を取り出したら、CATEGORYから名前を取り出せば良いということではないのですか? そもそもCATEGORYもmodelに入れる方が良いと思いますが。
dameo

2020/08/14 21:48

t_obaraさんのおっしゃってる内容を多少噛み砕きました。 カテゴリというのはモデルのItemで定義されてるようですが、一覧で表示したいならCATEGORYを そのまま使えばいいですよね?静的なメンバなのでItem.CATEGORYでアクセスできます。 def index(request): return render(request, 'app/index.html', {'category_list': Item.CATEGORY}) こんなに単純じゃないでしょうが、渡すだけなら大丈夫だと思います。 ただt_obaraさんのおっしゃるとおり、小さな分類表でもModelクラスとして定義してあげて、DBに入れてあげる方が一般的です。 基本的にWebサーバー側はデータを持たない作りが基本なので。 例えば、Webサーバーが負荷分散のために100台あるときにそういう定義をしてしまうと、コードの変更をする際に あるサーバーのカテゴリリストと別のサーバーのカテゴリリストが変わってしまいます。とても危険な状態ですよね。 しかしDB側に定義があればDBの機能を使って整合を保つことができます。 何で困っていたのかは私もよく分かりませんでしたが、参考になれば幸いです。
Mario_11

2020/08/15 01:02

Item.CATEGORYで取得できるとは知りませんでした。 勉強になりました! お二方とも詳しく説明していただきありがとうございます!!
guest

回答1

0

自己解決

python

1Item.CATEGORY

Item.CATEGORYでカテゴリを取得しました。

投稿2020/08/15 01:03

Mario_11

総合スコア95

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問