2012-05-30 2 views
0

Выражаю менеджер модели по умолчанию и добавить логику кэш-специфичные для него:PyCharm не понимает пользовательский менеджер модели

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() 

I использовать его в конкретной модели:

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., я вижу, что в поле автозаполнения содержатся два объекта : элементов: один помечается значком функции и имеет тип ReadOnlyManager, второй - с значком метода и имеет тип Manager.

Это ошибка PyCharm? Как включить автозапуск для дополнительных методов в пользовательском менеджере?

+0

отдельно от вашей проблемы, я рекомендую вам использовать IssueTracker на jetbrains, они действительно быстро подбирают эти вещи –

+0

@ArgsKwargs, спасибо, разместил его. Обновите эту тему, когда получите ответ. – Marboni

+0

@Marboni, любой ответ от JetBrains? Просто нашел эту проблему раздражающей :) – Munhitsu

ответ

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.

+0

youtrack.jetbrains.com/issue/PY-6664, исправлено в сборке -> 120.113 – Marboni

Смежные вопросы