我扩展默认模型管理器并向其添加特定于缓存的逻辑:
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+SpaceTokenType.
时,我看到,该自动完成框包含两个对象项:一个标有功能图标,类型为 ReadOnlyManager,第二个 - 带有方法图标,类型为 Manager。
是 PyCharm 错误吗?如何为自定义管理器中的其他方法启用自动完成?