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+Space を押すTokenType.と、オートコンプリート ボックスに 2 つのオブジェクト項目が含まれていることがわかります。

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 に答える