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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

346閲覧

Django2のmodel.pyのCharFieldでドロップリストから複数の値を受け取りたい

nre

総合スコア35

Django

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

Python 3.x

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

0グッド

1クリップ

投稿2019/08/09 05:42

前提・実現したいこと

現在Django2でwebアプリケーションを開発しております。
そこでmodel.pyのモデル内にあるフィールドCharFieldで複数の値を受け取りたいです。

現在はドロップリストから複数の選択肢が表示され
その中の一つを選択する事しか出来ません。
なので、複数の選択肢の中から1つから3つまで選択出来る様にしたいです。

該当のソースコード

pyhton

1#models.py 2 3SKILLS = ( 4 ('1','css'), 5 ('2', 'html'), 6 ('3', 'python') 7) 8 9class User(AbstractBaseUser, PermissionsMixin): 10 skill = models.CharField(('スキル'), max_length=150, choices=SKILLS, 11 blank=True) 12 13 14#forms.py 15 16class UserUpdateForm(forms.ModelForm): 17 """ユーザー情報更新フォーム""" 18 class Meta: 19 model = User 20 fields =('skill')

html

1<!--user_form.html--> 2<div class="col-6"> 3 <tr> 4 <th><label for="{{ form.skill.label }}">{{ form.skill.label }}</label></th> 5 <td>{{ form.skill }}</td> 6 </tr> 7</div> 8

試したこと

models.pyでBooleanFieldやManyToManyFieldを試したのですが、
うまく行きませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DangoのModelはあくまでDBとの連携部分です。なので、DB設計をある程度意識することが要求されます。
DB設計で多対多の持たせ方をしたい場合以下のように設計します(一例です)。

users
|Field|Type|Null|Key|Default|Extra|
|:--|:--:|--:|
|id|int(11)|NULL|PRI|NULL
|name|varchar(20)|NULL||NULL
|mail|varchar(50)|NULL||NULL

skills
|Field|Type|Null|Key|Default|Extra|
|:--|:--:|--:|
|id|int(11)|NULL|PRI|NULL
|name|varchar(20)|NULL||NULL

users_skills
|Field|Type|Null|Key|Default|Extra|
|:--|:--:|--:|
|id|int(11)|NULL|PRI|NULL
|user_id|int(11)|NULL|MUL|NULL
|skill_id|int(11)|NULL|MUL|NULL

上記からわかるように、ユーザとスキルで別々にテーブルを用意して、その二つをつなぐテーブルを用意します。
こうすることで、usersテーブルとskillsテーブルの多対多の関係を表現することができます。

では、Dangoでどのように実装するかという話なのですが、Dangoでも2つのモデルクラスを用意することは同様です。
ユーザクラスはすでにあると思うので、以下のようなスキルクラスを作成してください。

Python

1class Skill(models.Model): 2 name = models.CharField(max_length=20)

DB設計では users_skills テーブルを作成していましたが、 Dajngo のモデルではmodels.ManytoMany フィールドという便利なフィールドがあります。

Python

1class User(AbstractBaseUser, PermissionsMixin): 2 skills = models.ManytoMany(Skill)

このように記載することで自動でusers_skillsテーブルが作成され、多対多の関係を構築することができます。

投稿2019/08/13 00:44

nerianighthawk

総合スコア544

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問