0

我扩展默认模型管理器并向其添加特定于缓存的逻辑:

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 错误吗?如何为自定义管理器中的其他方法启用自动完成?

4

1 回答 1

1

这似乎是一个问题PyCharm。为 Python 编写一个自动完成功能确实是一项艰巨的任务,尤其是对于诸如Django Models, 它使用Meta Classes和其他讨厌的东西之类的东西。

然而,它是可能完成的,而且似乎并不难,例如我的自动完成(https://github.com/davidhalter/jedi/tree/dev,正在进行中,不要使用它)能够完成它:

完成TokenType.objects.

update                
by_id                 
by_lookup             
create                
use_for_related_fields

完成TokenType.

__metaclass__                 
__hash__                      
_get_next_or_previous_in_order
__ne__                        
date_error_message            
description                   
_perform_date_checks          
delete                        
clean                         
objects                       
unique_error_message          
_set_pk_val                   
_deferred                     
save_base                     
pk                            
serializable_value            
full_clean                    
__init__                      
code                          
save                          
__str__                       
validate_unique               
clean_fields                  
__repr__                      
_perform_unique_checks        
__reduce__                    
_get_unique_checks            
prepare_database_save         
_get_pk_val                   
__eq__                        
lookups                       
_get_next_or_previous_by_FIELD
Meta                          
_get_FIELD_display    

就我而言,PyCharm是封闭源代码,所以我认为您必须与 PyCharm 开发人员交谈。

于 2012-05-30T12:46:22.197 回答