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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1448閲覧

複数のレコードを一度に保存したい

ezeimte

総合スコア10

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/10/26 12:06

前提・実現したいこと

ForeignKeyで取得した値を使って
一度に複数のレコードを作成したいです。

発生している問題・エラーメッセージ

保存時に

ValueError Cannot assign "<QuerySet [<CustomPermission: マイページの変更>, <CustomPermission: マイページの閲覧>]>": "CustomPermissionUser.permission_name" must be a "CustomPermission" instance.

というエラーになります

該当のソースコード

Python

1"""Models.py""" 2class CustomPermission(models.Model): 3 perm_name = models.CharField('パーミッション名',max_length=100) 4 perm_codename = models.CharField('コードネーム',max_length=100) 5 del_flg = models.BooleanField(default=0) 6 def __str__(self): 7 return self.perm_name 8 9class CustomPermissionUser(models.Model): 10 permission_user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='ユーザー名') 11 permission_name = models.ForeignKey(CustomPermission,on_delete=models.CASCADE,related_name='custom_per_user',verbose_name='権限名')

python

1"""Forms.py""" 2class UserPermissionForm(forms.ModelForm): 3 permission_name = forms.ModelMultipleChoiceField( 4 label="権限設定", 5 queryset=CustomPermission.objects.all(), 6 widget=forms.CheckboxSelectMultiple, 7 ) 8 class Meta: 9 model = CustomPermissionUser 10 fields = ['permission_user','permission_name',] 11 12 def save(self, commit=True): 13 obj = super(UserPermissionForm,self).save() 14 if commit: 15 obj.save() 16 return obj

試したこと

Forms.pyのpermission_name =~ の部分が無ければ普通にプルダウンでひとつずつ保存できるので、その内容をいろいろ書き換えようと試みましたが、Querysetをinstanceにバラしてforでひとつずつ保存する?など考えましたが書き方がわかりませんでした・・

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

Django Version: 2.1.1
Python Version: 3.6.6
Spyder3.3.1

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

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

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

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

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

guest

回答1

0

ModelForm は便利ですが、このケースで使おうとするとかえってややこしく遠回りになりかねないので、通常の Form を使う方がよいのではないかと思います。

例えば UserPermissionForm を次のとおりに書き換える( ModelFormModel に変更する)と、

python

1# forms.py: 2 3from django import forms 4from django.contrib.auth.models import User 5 6 7class UserPermissionForm(forms.Form): 8 permission_user = forms.ModelChoiceField( 9 label="ユーザー名", 10 queryset=User.objects.all() 11 ) 12 permission_name = forms.ModelMultipleChoiceField( 13 label="権限設定", 14 queryset=CustomPermission.objects.all(), 15 widget=forms.CheckboxSelectMultiple, 16 )

このフォームに対応する view のデータ保存処理は次のように書くことができます。

python

1# views.py: 2 3form = UserPermissionForm(request.POST or None) 4if form.is_valid(): 5 fields = form.cleaned_data 6 permission_user = fields["permission_user"] 7 for permission_name in fields["permission_name"]: 8 CustomPermissionUser.objects.create( 9 permission_user=permission_user, 10 permission_name=permission_name, 11 )

( import 文は省略しています)

フォームフィールド permission_nameModelMultipleChoiceField で定義されているので、 form.cleaned_data["permission_name"]for ループで回せる django.db.models.query.QuerySet になっているはずです。ですので、それを for ループで回して CustomPermissionUser を 1 件ずつ保存していけばよいのではないかと思います。

(仮に ModelForm を使い続けられたとしても、この「 form.cleaned_data["permission_name"]for ループで回す」というところは共通になるはずです)

ちなみに、直接の解決策ではありませんが別のアプローチとして、 CustomPermissionUser.permission_nameManyToManyField として定義する形もありなのではないかと思います。

すでにご解決されているかもしれませんが、ご参考になれば幸いです。

投稿2018/10/30 13:27

gh640

総合スコア1407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問