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

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

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

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

Q&A

1回答

549閲覧

models.pyファイルで、countとweightのデータ入力欄をset_countに入力された数と同じ数だけ作成したい。(django)

gor

総合スコア0

Django

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

0グッド

1クリップ

投稿2021/05/25 04:13

前提、実現したい設定

現在、django3.2.3 で筋トレメニューを管理するメモアプリを作成しています。

models.pyファイルで、countとweightのデータ入力欄をset_countに入力された数と同じ数だけ作成したいと考えています。
例えば、set_countに3を入力すると、countとweight入力欄が3個づつ作成される設定です。
しかし下記のようにコードを書いても上手くいきません。
何か良い方法があれば教えてほしいです。

該当のソースコード

#models.py from django.db import models # Create your models here. back_menu = ('rat_pull','ラットプル'),('dead_lift','デッドリフト'),('bent','ベントオーバー'),('lia','リアデルト') class BackModel(models.Model): menu = models.CharField( max_length=30, choices = back_menu ) date = models.DateField(null = True) set_count = models.IntegerField(default=0) x = 1 while x <= set_count: count = models.IntegerField(default=0) weight = models.IntegerField(default=63) x += 1 def __str__(self): return self.menu

###エラーメッセージ

while x <= set_count: TypeError: '<=' not supported between instances of 'int' and 'IntegerField'

試したこと

エラーメッセージで、<=はintとIntegerField間では使えないと書いてあるので、set_count内に入力された数字のデータを抽出することを試みました。
↓(修正前)

from django.db import models # Create your models here. back_menu = ('rat_pull','ラットプル'),('dead_lift','デッドリフト'),('bent','ベントオーバー'),('lia','リアデルト') class BackModel(models.Model): menu = models.CharField( max_length=30, choices = back_menu ) date = models.DateField(null = True) set_count = models.IntegerField(default=0) x = 1 while x <= set_count: count = models.IntegerField(default=0) weight = models.IntegerField(default=63) x += 1 def __str__(self): return self.menu

↓(修正後)

from django.db import models # Create your models here. back_menu = ('rat_pull','ラットプル'),('dead_lift','デッドリフト'),('bent','ベントオーバー'),('lia','リアデルト') class BackModel(models.Model): menu = models.CharField( max_length=30, choices = back_menu ) date = models.DateField(null = True) set_count = models.IntegerField(default=0) x = 1 while x <= BackModel.objects.all().filter(set_count): count = models.IntegerField(default=0) weight = models.IntegerField(default=63) x += 1 def __str__(self): return self.menu

↓(修正後のエラーメッセージ)

while x <= BackModel.objects.all().filter(set_count): NameError: name 'BackModel' is not defined

BackModel.objects.all().filter(set_count)の使い方が間違っているのでしょうか?
そもそもwhile文の使い方が間違っているのでしょうか?

djangoを勉強したばかりで初歩的なことかもしれませんが、何か知っていればご教授お願いいたします。

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

djangoのバージョン 3.2.3
pythonのバージョン 3.8.5
WSL Ubuntu-20.04で編集しています。

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

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

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

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

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

guest

回答1

0

外部キーを使ってModelを分けるのはいかがでしょうか?
Model自体はDBのテーブルと同定義なので以下のような形でBackModelとChildModel(set_count分だけ増える部分です)に分けます。

python

1class BackModel(models.Model): 2 menu = models.CharField( 3 max_length=30, 4 choices = back_menu 5 ) 6 date = models.DateField(null = True) 7 set_count = models.IntegerField(default=0) 8 9 10class ChildModel(models.Model): 11 back_model = models.ForeignKey(BackModel, on_delete=models.CASCADE) 12 count = models.IntegerField(default=0) 13 weight = models.IntegerField(default=63)

そして、set_countに入力された分だけ動的にChildModelのFormの数を変更しまして、
back_modelのIDをChildModelに紐づかせるとうまくやりたいことが実現できるかと思います。
外部キーについては下記がわかりやすいかと思います。
https://ymgsapo.com/2018/09/22/table_relation_foreignkey/

投稿2021/05/29 20:04

m2l

総合スコア318

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問