【问题标题】:PyCharm doesn't understand custom Manager of modelPyCharm 不理解模型的自定义管理器
【发布时间】:2012-06-04 11:18:54
【问题描述】:

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

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 突出显示它并写入“未解析的属性引用”警告。当我在TokenType. 之后按 CMD+Space 时,我看到,该自动完成框包含两个 对象 项:一个标有功能图标,类型为 ReadOnlyManager,第二个 - 带有方法图标,类型为 Manager。

是 PyCharm 的错误吗?如何在自定义管理器中启用其他方法的自动完成?

【问题讨论】:

  • 与你的问题分开,我建议你在jetbrains上使用IssueTracker,他们真的很快就能找到这些东西
  • @ArgsKwargs,谢谢,已发布。得到答案后将更新此主题。
  • @Marboni,JetBrains 有什么回应吗?刚发现这个问题很烦人:)
  • @Munhitsu,PyCharm 支持人员回答说他们计划在 1.6 中修复它:youtrack.jetbrains.com/issue/PY-6664。在票证中,我看到“已修复 -> 120.113”。

标签: python django autocomplete pycharm django-managers


【解决方案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 开发人员交谈。

【讨论】:

  • youtrack.jetbrains.com/issue/PY-6664,已在构建中修复 -> 120.113
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多