7

必然的にユーザー自身が管理する複雑な権限構造を持つアプリを開始しています。モデルには次の権限があります。

class Meta:
    permissions = (
    ('can_view', 'View project'),
    ('manage_view', 'Can assign View project'),
    ('can_edit', 'Edit project'),
    ('manage_edit', 'Can assign Edit project'),
    ('can_delete', 'Delete project'),
    ('manage_delete', 'Can assign Delete project'),
    ('creator', 'Full access to model features.'),
    )

これらは Django-guardian を使用してオブジェクト レベルで管理され、さまざまな組み合わせと機能のすべてに対処するためにカスタム ミックスインを使用しています。

「作成者」権限はオブジェクトの最初の作成者に割り当てられ、電子メール ベースの招待システムを介して他の権限をユーザーに割り当てることができます。

私の質問は、オブジェクトの作成時に作成者のアクセス許可を割り当てるためのオプションに関するものです。

これまでに私が考えたいくつかのアプローチ:

保存後にビューに割り当てる

newObject.save()
assign('creator', User, newObject)

ただし、一般的に、私はこれらのタイプのイベントを自分のビューから除外することを好みます。

save() をオーバーライドする

この方法の問題点は、ユーザー オブジェクトへの保存アクセス権を付与する必要があることです。これは、initをオーバーライドして、self.request = request を設定することも意味します。

post_save シグナル

このシグナルを利用できることはわかっていますが、前の 2 つと比較して、まだ実装を試みていません。

うまくいけば、これで私がどこにいるのかについて十分な洞察が得られます。

これらの方法の中で何が最善であるか、またはそれらがすべて悪い考えである場合は、代替の実装が何であるかを知りたいです.

ありがとう、

JD

4

1 に答える 1

4

AD Override save() :ユーザーパラメーターをメソッドに追加できますsave(そのため、オーバーライドする必要はありませんinit)。このように、ユーザーsaveインスタンスを渡さずにメソッドを呼び出そうとすると、実行時にコードが壊れてしまいます (コードをテストする限り、その方法で問題ありません)。

AD post_save シグナル: 試していない場合は... 試してみてください! シグナルのトピックに関するドキュメントはかなり充実しており、学ぶのはかなり簡単です。注意が必要なのは、信号をどこに接続する必要があるかということです (モデルモジュールの最後で行うことをお勧めします)。

残念ながら、あなたの答えに最適なアプローチはありません。また、生の SQL を使用してインスタンスを挿入した場合、または実行した場合( https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-createsave )、メソッドもシグナルも起動されないことに注意してください。したがって、この自動権限割り当てを行う場所を特定します (いずれにせよ、おそらく 1 か所である必要があります)。post_savebulk_create

または、作成者を指す FK フィールドをモデルに追加できます。ガーディアンの許可を確認する代わりに、その情報を使用することができます (また、実際に問題にうまく適合するはずのミックスインの使用について指摘したように)。少し前に、プロジェクト管理アプリケーションにそのアプローチを使用しました。

それが役立つことを願っています!

https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create

于 2012-11-07T22:26:07.230 に答える