実現したいこと
データベース上の野菜の一覧から、同一の特徴を持つ野菜だけを抽出して表示する
webアプリを作っています。
欲しいものは、タグ機能の実装です。以下の条件を満たしたものを作成したいです。
- タグの名称を後で変更できる
- 一つのに複数のタグ(10個ほど)を付けることができる
- 現状のFlask、sqlalchemyで実現したいです
発生している問題・分からないこと
https://senews.jp/toxi1/
リンク先の「TOXI法」を参考に
記事のテーブル(Vagitable)と、タグのテーブル(Tag)と、
記事とタグを紐づけるテーブル(Tag_map)の
三種類を用意する方法を実装したいのですが、
絞り込んだ記事を呼び出す方法がわかりません。
用意したテーブル
Vegetable
id | name |
---|---|
1 | ピーマン |
2 | トマト |
3 | キャベツ |
Tag
id | name |
---|---|
1 | 緑の野菜 |
2 | 根菜類 |
3 | 葉菜類 |
Tag_map
id | vegetable_id | tag_id |
---|---|---|
1 | 1 | 3 |
2 | 1 | 1 |
3 | 2 | 3 |
4 | 3 | 1 |
※ピーマンに緑の野菜&果菜類
トマトに果菜類
キャベツに緑の野菜&葉菜類 をタグ付けした例です
該当のソースコード
app.py
1from flask import Flask, render_template 2from flask_sqlalchemy import SQLAlchemy 3 4app = Flask(__name__) 5app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///log.db' 6db = SQLAlchemy(app) 7 8class Vegetable(db.Model): 9 id = db.Column(db.Integer, primary_key=True) 10 name = db.Column(db.String, nullable=False) 11 12class Tag(db.Model): 13 id = db.Column(db.Integer, primary_key=True) 14 name = db.Column(db.String, nullable=False) 15 16class Tag_map(db.Model): 17 id = db.Column(db.Integer, primary_key=True) 18 vegetable_id = db.Column(db.Integer, nullable=False) 19 tag_id = db.Column(db.Integer, nullable=False) 20 21@app.route('/vegetable') 22def vegetable(name): 23 tags = db.session.query(Tag).all() 24 vegetables = db.session.query(Vegetable).all() 25 return render_template('vegetable.html', tags=tags, vegetables=vegetables) 26 27@app.route('/vegetable/<tag_id>') 28def vegetable_filter(tag_id): 29 tags = db.session.query(Tag).all() 30 31# 不明なのは以下の行です。これでは全ての野菜が抽出されてしまいますが 32# 上で取得した<tag_id>を使用し、絞り込んだ野菜だけをvegetablesへ格納したいのです。 33# (「緑の野菜」タグidである「1」を取得したならば、ピーマンとキャベツのみ格納) 34 35 vegetables = db.session.query(Vegetable).all() 36 37 return render_template('vegetable.html', tags=tags, vegetables=vegetables)
vegetable.html
1# 絞り込みたいタグを選択できるように一覧表示 2{% for tag in tags %} 3 <a href="/vegetable/{{tag.id}}">{{tag.name}}</a> 4{% endfor %} 5 6# 絞り込んだ野菜の名前を表示 7{% for vegetable in vegetables %} 8<p>{{vegetable.name}}</p> 9{% endfor %}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
野菜のテーブルにたくさんタグ付け用カラムを用意してみました。
Vegetable
id | name | タグ1 | タグ2 | タグ3 | タグ4 | タグ5 |
---|---|---|---|---|---|---|
1 | ピーマン | 果菜類 | 緑の野菜 | |||
2 | トマト | 果菜類 | ||||
3 | キャベツ | 緑の野菜 |
例はタグ少ないですが、たくさんのタグを使用できる設計にしたいのです。
管理が非常に大変で、リネームも難しく
絞り込みのコードも非常に長くなりやめました。
補足
沢山検索し沢山試し非常に苦戦しております。
知恵をお貸しください。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/23 12:14