ドキュメントの作成を伴う Django アプリを作成しています。いくつかの要件があります。
- ユーザーがドキュメントを表示できるかどうかを確認します。
- ユーザーがドキュメントの表示を許可されている場合は、権限のあるドキュメントの表示のみを許可します。
私は2つの解決策を考え出しましたが、一方が哲学的/実際的に優れているかどうか疑問に思っています.
私が思いついた2つの解決策は次のとおりです。
解決策 1 (サードパーティの Django-Guardian を使用)
Models.py
class Document(models.Model)
owner = models.ForeignKey(User)
document_name = models.CharField(max_length=60)
document_content = models.TextField()
class Meta:
permissions = (
('view_document', 'View Document'),
)
views.py
@permission_required('document.view_document', (Document, 'pk', 'document_id'))
def view_document(request, document_id):
document = Document.objects.get(pk=document_id)
return render_to_response("native/view_events.html",
{
'document' : document,
}, context_instance=RequestContext(request))
解決策 1 の欠点は、オブジェクトを作成するたびにアクセス許可を明示的に設定する必要があることと、データベースに 2 回アクセスする必要があることです。
解決策 2 (組み込みの Django アクセス許可を使用)
Models.py
class Document(models.Model)
owner = models.ForeignKey(User)
document_name = models.CharField(max_length=60)
document_content = models.TextField()
viewers = models.ManyToManyField(User)
class Meta:
permissions = (
('view_document', 'View Document'),
)
views.py
@permission_required('document.view_document')
def view_document(request, document_id):
document = Document.objects.filter(pk=document_id, viewers__pk=request.user.pk)[0]
return render_to_response("native/view_events.html",
{
'document' : document,
}, context_instance=RequestContext(request))
解決策 1 の欠点は、2 つのチェックを行う必要があることです。これのプラス面は、すべてのドキュメントを表示できるようにしたい管理者がいる場合、各ドキュメントに明示的に許可を与える必要がないことです。彼に「ドキュメントの表示」権限を与えるだけです。
どちらのソリューションにも長所と短所があるようです。理論/実践で優れているものはありますか?