デフォルトのモデル マネージャーを拡張し、それにキャッシュ固有のロジックを追加します。
class ReadOnlyManager(manager.Manager):
use_for_related_fields = True
def create(self, **kwargs):
obj = super(ReadOnlyManager, self).create(**kwargs)
cache.cache_read_only_object(obj)
...
return obj
def update(self, *args, **kwargs):
raise ReadOnlyException()
def by_id(self, object_id):
return cache.retrieve_read_only_object(self.model, object_id)
def by_lookup(self, lookup_key, lookup_value):
return cache.retrieve_read_only_object_by_lookup(self.model, lookup_key, lookup_value)
次に、それを使用する抽象モデルを作成しました。
class ReadOnlyModel(models.Model):
class Meta:
abstract = True
objects = ReadOnlyManager()
具体的なモデルで使用します:
class TokenType(ReadOnlyModel):
code = models.CharField(_('code'), max_length=30, unique=True)
description = models.CharField(_('description'), max_length=100)
lookups = {
'code': 'code'
}
*by_id* など、カスタム キャッシュに固有のメソッドを呼び出そうとすると、次のようになります。
TokenType.objects.by_id(1) # This code works
PyCharm はそれを強調表示し、「未解決の属性参照」警告を書き込みます。の後に CMD+Space を押すTokenType.
と、オートコンプリート ボックスに 2 つのオブジェクト項目が含まれていることがわかります。
PyCharmのバグですか?カスタムマネージャーで追加のメソッドのオートコンプリートを有効にする方法は?