少数のDjangoプロジェクト/サイトで共有されているDjangoアプリの大規模なライブラリがあります。各プロジェクト/サイト内には、ライブラリ内の基本クラス(多くのモデルがサブクラスになっている)の1つにミックスインされる「ミックスイン」クラスを定義するオプションがあります。
この例では、ライブラリ内の基本クラスがPermalinkBase
であり、ミックスインクラスがであるとしProjectPermalinkBaseMixIn
ます。
からの非常に多くのモデルサブクラスがあるため、PermalinkBase
で定義されたすべてのメソッド/プロパティProjectPermalinkBaseMixIn
がすべてのサブクラスによって利用されるわけではありませんPermalinkBase
。
承認されていないクラスからアクセスされた場合にProjectPermalinkBaseMixIn
実行(または少なくとも返される)を制限するために、メソッド/プロパティに適用できるデコレータを作成したいと思います。None
これが私が今それをしている方法です:
class ProjectPermalinkBaseMixIn(object):
"""
Project-specific Mix-In Class to `apps.base.models.PermalinkBase`
"""
def is_video_in_season(self, season):
# Ensure this only runs if it is being called from the video model
if self.__class__.__name__ != 'Video':
to_return = None
else:
videos_in_season = season.videos_in_this_season.all()
if self in list(videos_in_season):
to_return = True
else:
to_return False
return to_return
これが私がそれをしたい方法です:
class ProjectPermalinkBaseMixIn(object):
"""
Project-specific Mix-In Class to `apps.base.models.PermalinkBase`
"""
@limit_to_model('Video')
def is_video_in_season(self, season):
videos_in_season = season.videos_in_this_season.all()
if self in list(videos_in_season):
to_return = True
else:
to_return = False
return to_return
これはデコレータで可能ですか?この回答は、デコレータをよりよく理解するのに役立ちましたが、上記の問題を解決するためにデコレータを変更する方法を理解できませんでした。
デコレータはこの仕事に適したツールですか?もしそうなら、どのようにlimit_to_model
デコレータ関数を書くのでしょうか?そうでない場合、この問題に取り組むための最良の方法は何でしょうか?