2016-08-08 11 views
2

私は、それぞれがForeign KeyとしてUserを使用する約10個のモデルを持っています。ユーザーが削除されると、これらの各テーブルの値をユーザーを削除するユーザーに設定する必要があります。権限のあるスタッフがユーザーをdjango管理エリアから削除しています。djangoモデルのon_deleteのSET値からリクエストパラメータにアクセスする方法

私は関数を呼び出して、値を設定するon_deleteメソッドのSETを使う必要があると思います。 これはドキュメントごとのコードです。

from django.db import models 
from django.contrib.auth.models import User 

def get_sentinel_user(): 
    return User.objects.get_or_create(username='deleted')[0] 

class MyModel(models.Model): 
    user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user)) 

私の場合、ユーザーを削除するユーザーを取得したいと考えています。これはRequestパラメータからのみ取得できます。 get_sentinel_user関数でリクエストパラメータにアクセスするにはどうすればよいですか?

答えて

2

スタッフは他のユーザーを削除しており、削除されたユーザーに属するオブジェクトの所有権を効果的に奪っているため、delete_modelメソッドをAdminに上書きするだけです。あなたはまだ危機を脱していないHowveer delete_modelはすでにからrequest.user

へのアクセス権を持っているのでget_sentinel_userがもはや必要とされていることを

def delete_model(self, request, obj) : 
    ''' 
    deletes a single item. changes ownership 
    ''' 
    MyModel.objects.filter(user_id=obj.pk).update(user_id=request.user.id) 

    obj.delete() 

注意してください。管理者には一括削除アクションがあります。あなたは実際にはユーザーadminのためにdisable the bulk delete actionを持っていて、あなたが完全にコントロールできるようにあなた自身のものに置き換えてください。

「選択したオブジェクトを削除」アクションは、重要な注意点があります 効率の理由でQuerySet.delete()を使用しています:モデルの 削除()メソッドが呼び出されません。

ここで働く唯一の他のdjangoベースのソリューションは、ユーザーマネージャのdeleteメソッドをオーバーライドすることです。しかし、ユーザー・マネージャーはrequest.userインスタンスetherにアクセスすることはできません。

+0

しかし、get_sentinel_userで 'request'パラメータにアクセスするにはどうすればよいですか?インスタンスには、削除されるユーザーのIDのみがあります。私はユーザーを削除するユーザーのIDを取得したい、その情報は要求パラメーター内にのみあります。 – linuxfreak

+0

私はユーザーのためにdjango.contrib.auth.models.Userを使用しています。管理者がユーザーを削除すると、DELETE要求がトリガーされます。要求には、request.userにユーザーの情報が含まれています。ビューセットに入っている場合は、self.requestから情報を取得できます。問題はモデルからアクセスすることです。どうすればいいのですか? – linuxfreak

+0

私はすべて一緒に間違ったアプローチをしていることを知っているだけでなく、あなたが提供したget_sentinel_user()が要求パラメータを受け入れない赤ん坊です。 – e4c5

2

まず、on_delete.SETはパラメータなしで呼び出し可能なように設計されているため、source codeを確認してください。

実際の問題解決方法はさまざまな方法で達成できますが、deleted_byという列を追加してこのエントリを削除したユーザーにはForeignKeyとするとよいと思います。実際の削除の代わりにis_activeという名前の列を追加し、誰かがそのユーザーを削除するとFalseに設定します。

たとえば、this articleを読むことで、削除動作を変更して更新することができます。それは良い例とgithubの要点のリンクが含まれています。

そして本当に必要なのはsignalsを使って行うことができるselfSETにすることです。 StackOverflowのカップルの質問:onetwo

+0

私はDjangoのユーザーモデルを使用しているため、ユーザーモデルにdeleted_byを追加できません。フィールドを追加したくありません。シグナルの使用は良い選択肢のように聞こえる。しかし、問題は、削除するユーザーのuser_idではなく、ユーザーを削除するユーザーのuser_idを取得することです。その情報はリクエストパラメータからのみ取得できます。どのようにリクエストパラメータにアクセスできますか? – linuxfreak

+0

組み込みのユーザーモデルを変更する必要はありません。 docs:https://docs.djangoproject.com/en/1を確認してください。10/topics/auth/customizing /#既存のユーザーモデルを拡張する 私のアプローチでは、削除するユーザーのIDを持ち、必要なときにいつでもアクセスできます。 – valignatev

関連する問題