django-cached-field

Tela Software:
django-cached-field
Detalhes de Software:
Versão: 1.2.2
Data de upload: 14 Apr 15
Revelador: Martin Chase
Licença: Livre
Popularidade: 2

Rating: 1.0/5 (Total Votes: 1)

é um app Django que fornece cache-field-django aipo-adiada, campos ocultos em Django ORM para dados caro para calcular
Usando Django ORM e aipo, mantenha-caro-para calcular atributos up-to-date.
Exemplo
Digamos que você tenha um método lento em um dos seus modelos:
classe Poste (models.Model):
& Nbsp;property
& Nbsp; def slow_full_name (self):
& Nbsp; o sono (30)
& Nbsp; return 'The% s% s de% s'% (self.weight, self.first_name, self.country)
Ugh; muito devagar. Vamos cache que. Vamos querer algumas ferramentas. Aipo com django-aipo terá de ser configurado e cantarolando suavemente. Então nós vamos adicionar em nosso campo em cache, herdam o modelo mixin e renomear o nosso método de forma adequada:
de django_cached_field CachedIntegerField importação, ModelWithCachedFields
classe Poste (models.Model, ModelWithCachedFields):
& Nbsp; slow_full_name = CachedTextField (null = True)
& Nbsp; def calculate_slow_full_name (self):
& Nbsp; o sono (30)
& Nbsp; return 'The% s% s de% s'% (self.weight, self.first_name, self.country)
(Yeah, calculate_ é apenas uma convenção. Eu claramente não ter desistido do fantasma rails ...)
Em seguida, migrar seu esquema db para incluir o novo campo em cache utilizando o sul, ou rolar o seu próprio. Note-se que dois campos serão adicionados a esta tabela, cached_slow_full_name do tipo texto e slow_full_name_recalculation_needed do tipo boolean, provavelmente inadimplente para true.
Já que é um bocado melhor. lamppost.slow_full_name pode demorar até 30 segundos, a primeira vez que ele é chamado para um determinado registro, mas a partir de então, vai ser quase instantânea. É claro que, neste momento, ele nunca vai mudar após a primeira chamada.
A parte restante importante do quebra-cabeça é invalidar o nosso cache. Thoses campos constituintes provavelmente são alterados em alguns views.py (este poderia ser mais inteligente sobre a perceber se os valores relevantes são atualizados):
render_to ("poste / edit.html")
editar def (request, lamppost_id):
& Nbsp; poste = Lamppost.objects.get (pk = lamppost_id)
& Nbsp; se request.method == 'POST':
& Nbsp; form = LamppostForm (request.POST)
& Nbsp; se form.is_valid ():
& Nbsp; form.save ()
& Nbsp; form.instance.flag_slow_full_name_as_stale ()
& Nbsp; mais:
& Nbsp; form = LamppostForm ()
& Nbsp; return {"forma": forma, 'poste': poste}
Esta é a parte mais difícil como o desenvolvedor! Caching exige que você caçar todos os lugares o valor pode ser alterado e chamando esse método flag_slow_full_name_as_stale. É o país recebe um novo valor aleatório todas as manhãs no cron'o'clock? Essa bandeira tinha melhor estar obsoleto por cron'o'one. Você calcular o peso com base na soma de todos os pombos associados? Ligar para o pouso pombos. E a decolagem. E tudo o que muda o peso de um pombo individual. Como Abraham Lincoln disse: "Há apenas dois problemas difíceis na programação:. Nomeação, invalidação de cache e erros de off-by-one"
Instalação
Você pode tornar as coisas fáceis para você:
pip instalar em cache-django-campo
Ou, para uma instalação manual, você pode clonar o repo e instalá-lo usando python e setup.py:
git git clone: ​​//github.com/aquameta/django-cached-field.git
cd Django cache-campo /
python setup.py instalar
Testado com Django 1.3.1, 2.3.1 aipo, django-aipo 2.3.3.
Configuração
Duas mudanças de configurações são praticamente necessários para que as coisas funcionem: certifique-se de que é um app registrada, certifique-se de aipo vê seu arquivo de tarefas:
INSTALLED_APPS + = ['django_cached_field',]
CELERY_IMPORTS + = ['django_cached_field.tasks',]
Uma mudança é opcional: se o recálculo deve acontecer quando sinalizado como obsoleto (padrão) ou ser deixado para a próxima vez que o atributo é acessado. Isso é útil para ambientes de teste, onde você não se importa que os seus valores em cache são inválidos. Note-se que nesta situação, você não precisaria de aipo.
CACHED_FIELD_EAGER_RECALCULATION = True ou False # para ambientes de teste
Esta é uma opção global, assim exceções individuais em vez deve ser manuseado por passando o argumento and_recalculate à chamada flag_FIELD_as_stale.
Advertências
- Condição de corrida, se você sinalizar um campo como obsoleto em uma transação db que leva mais tempo para concluir que o trabalho aipo preciso para ser chamado.
- Todos os métodos ORM (por exemplo order_by, filtro) precisa usar cached_FIELD.
- Recalculate_FIELD usa .Update (cached_FIELD = para definir o valor.
- Flag_FIELD_as_stale usa .Update, assim

Requisitos :

  • Python
  • .
  • Django

Comentário para django-cached-field

Comentários não encontrado
Adicionar comentário
Ligue imagens!