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

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

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

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

Python

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

Q&A

0回答

414閲覧

管理画面より、特定の条件の時のみレコードの削除を行う方法

ruuuu

総合スコア174

Django

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

Python

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

0グッド

0クリップ

投稿2020/09/21 07:29

編集2020/09/21 07:30

Djangoの管理画面より、テーブルのレコードを特定の条件の時のみ、削除したいと考えています。
具体的には、「名前テーブル」「得点テーブル」「チェック項目テーブル」の3つのテーブルがあるのですが、「得点テーブル」「チェック項目テーブル」には、「名前テーブル」への「1対1」の外部キーを設定しています。以下は、得点テーブルを定義したクラスになります。

class Score(models.Model): score = models.IntegerField(blank=False, null=False) name_list = models.OneToOneField( NameList, on_delete=models.CASCADE, primary_key=True ) created_at = models.DateTimeField() updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s" % (self.score)

得点テーブル及び、チェック項目テーブルには、admin.pyにて、以下のメソッドを追加し削除や変更などの操作を管理画面より行えないよう設定をしました。

class DisplayScore(admin.ModelAdmin): list_display = ("score", "name_list") readonly_fields = ("score", "name_list", "created_at", "updated_at") def has_change_permission(self, request, obj=None): return False def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False

その為、管理画面から、「得点テーブル」「チェック項目テーブル」をクリックしレコードの削除を行うことは出来ず、外部キーにより関連づいている為、「名前テーブル」のレコードも削除出来ない状況です。
しかし、ここで、「名前テーブル」からは、レコードの削除を行いたいと考えています。
無論、外部キーにより、関連づいている「得点テーブル」及び「チェック項目テーブル」のレコードも削除を行いたいと考えているのですが、こちらを実現する方法はありますでしょうか。
どなたか、ご助言頂けましたら幸いです。

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

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

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

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

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

llr114

2020/09/22 08:53

>テーブルのレコードを特定の条件の時のみ、削除したいと考えています。 この特定の条件というのは何でしょうか?
ruuuu

2020/09/22 10:39 編集

> この特定の条件というのは何でしょうか? こちらですが、「名前テーブル」のレコードを削除した場合に、関連づいている他2つのテーブルのレコードも削除することを考えておりました。 「得点テーブル」及び「チェック項目テーブル」からレコードは一切削除することは出来ないが、「名前テーブル」からは削除出来るように実装したいといった形です。
llr114

2020/09/22 11:05

確認が多くて申し訳ないですが、 名前テーブルから削除、というのは管理画面の名前テーブルの画面から「得点テーブル」及び「チェック項目テーブル」を削除できるようにしたい、という認識で間違い無いでしょうか?
ruuuu

2020/09/22 11:33 編集

いえ... 詳細に記載出来ておらず、申し訳ないです。 > というのは管理画面の名前テーブルの画面から「得点テーブル」及び「チェック項目テーブル」を削除できるようにしたい、という認識で間違い無いでしょうか? こちら正確には、名前テーブルの画面から、特定の名前レコードを削除した際に、それに紐づいている「得点テーブル」及び「チェック項目テーブル」のレコードも削除する形にしたいです。
llr114

2020/09/23 02:11

その場合、on_delete=models.CASCADEがついていれば基本的に削除できるかと思いますが、どのような挙動をして削除をできないんでしょうか? 例えば、エラー画面になって削除ができないのと、エラー画面すら出ないのとでは原因が違ってきます。 基本的に質問をする際には、そこらへんの詳細を書くようにお願いします。 また、今回ですと3つのテーブルの話なのに、記載されているモデルがScoreだけなのでそこの追記もしたほうがいいかと思います。
ruuuu

2020/09/23 11:00 編集

ご返信遅れてしまい、すみません。 > その場合、on_delete=models.CASCADEがついていれば基本的に削除できるかと思いますが、どのような挙動をして削除をできないんでしょうか? こちらなのですが、「admin.py」の得点テーブル及び、チェックリスト項目テーブルの表示させる項目を記載したクラス(DisplayScore)などに、 「 def has_delete_permission(self, request, obj=None): return False」 こちらを記述していることにより、管理画面の名前テーブルからレコードを削除しようとした場合に以下のようなメッセージが表示され、削除出来なくなってしまっている状況です。 「選択した name list を削除すると関連するオブジェクトも削除しますが、あなたのアカウントは以下のオブジェクト型を削除する権限がありません: score check item list 」
ruuuu

2020/09/23 11:01

すみません。業務の都合上見せられない部分があるのですが、それでしたら、回答する上で弊害になってしまいますし、どうしようもないですよね...
llr114

2020/09/24 06:49

理解しました。 その場合、has_delete_permissionはつけないで、has_view_permissionだけにすればいいのではないでしょうか? 自分で試したことがないのでわかりませんが、has_view_permissionだけにすれば該当する画面は見えない→けど削除機能は残る、といったことが実現できるのではないでしょうか?
ruuuu

2020/09/24 09:58

ご助言ありがとうございます。 admin.pyの「DisplayScore」及び、DisplayCheckItemに以下のように「has_view_permission」を追加し、他、has_delete_permissionなどを削除しました。 「 def has_view_permission(self, request, obj=None): return False 」 しかし、名前テーブルからレコードは削除出来るのですが、得点テーブル、チェック項目テーブルからもレコードが削除出来てしまう状況です。 しかしこちらなのですが、出来ましたら、得点テーブル、チェック項目テーブルからはレコードの削除を行えないように設定したいと考えております。
llr114

2020/09/24 10:05

>得点テーブル、チェック項目テーブルからはレコードの削除を行えないように設定 ということは、編集等は出来るままで、ということでしょうか?
ruuuu

2020/09/24 10:25

あ、いえ、編集も不可の状態にし、得点テーブル、チェック項目テーブルからはデータの閲覧のみ、名前テーブルからはデータの閲覧と、レコードの削除のみを行えるように出来たらと考えております。
llr114

2020/09/24 10:41

その場合 readonly_fields = ("score", "name_list", "created_at", "updated_at") に全部の項目入れて、 def has_change_permission(self, request, obj=None): return False def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False を消すという対応ではダメなんでしょうか?
ruuuu

2020/09/24 11:10

度々、申し訳ないです。 ご提示頂いた方法で、試して見たのですが、チェック項目リスト及び得点テーブルからレコードの削除が出来てしまったのですよね...
ruuuu

2020/09/25 03:24

いえいえ... ご助言ありがとうございます。 def has_delete_permission(self, request, obj=None): return True こちら追加しましたが、チェック項目テーブルに def has_delete_permission(self, request, obj=None): return False こちらがついているとやはり以下のようなメッセージが出力されてしまいます... host name list 'test' の削除時に関連づけられたオブジェクトも削除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除するパーミッションがありません: check item list
ruuuu

2020/09/25 03:27 編集

しかし、チェック項目テーブルの以下のメソッドを削除してしまった場合、チェック項目テーブルからは、レコードが削除出来るようになってしまうのですよね... def has_delete_permission(self, request, obj=None): return False
llr114

2020/09/25 04:36

そうですね。 無理矢理な感じはしますが、urls.pyで見せたくないページをDjangoのデフォルトの管理画面ではなく、独自に作ったページに遷移させるのはどうでしょうか? そこをログイン必須のデータの一覧画面にすれば、要件は満たす気がします、、、
ruuuu

2020/09/25 06:52

ご助言ありがとうございます。 一度、検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問