Campos dinâmicos 

sem ""nosql""


github.com/multmeio/hstore-flattenfields


Luan Fonseca
luanfonceca@gmail.com
github.com/luanfonceca

Quem sou eu


  • Luan Fonseca, 21 Anos, Pythonista desde 2011
  • Estudante de Engenharia de Software / UFRN
  • Desenvolvedor de Software
    • Pythonista & Djangonauta na Multmeio
    • Rubysta na 4Soft, EJ do curso EngSoft
  • Entusiasta e Evangelista Python e Open Source

disclaimer


versão 0.8 

pré-beta

""NoSql""



Não me matem!


itexto.net/devkico/?p=1523

Motivações



  • "Schema-less"
  • Variabilidade nos Fields dos Models
  • Usuário poder escolher os Campos
  • Filtros de quais Objetos tem Campos
  • Painéis para Agrupar Campos no Form

PREOCUPAÇÕES


  • Deixar transparente para o Django
    • Models._meta.*
      • fields, get_all_field_names, get_field_by_name
    • Forms
      • Fields
        • Widgets
          • attrs = {'class':  'campo_texto'}

Preocupações


  • Manter tudo do Django
    • Todos os Managers
      • create(*fields)
      • [filter | exclude](field_name=value_name)
        • [i]contains, [i]exact, in, gt[e], lt[e] ...
    • Integração entre Pacotes Externos
      • ModelMommy
    • Escalabilidade / Performance
      • Indices & Cache
    • Manter no Banco o que é do Banco
    • Não usar Tabelas para Atributo-Valor

tecnologia escolhida


HStore

  • É um Tipo de Dado do Postgresql 
  • Tem a estrutura de Pares de Key-Value
  • Permite Indexação

Select com Hstore


banco => CREATE EXTENSION hstore;-------------------------------------select id, campo->'chave' from  tabelawhere campo->'chave' = 'Valor'

Porque hstore?



  • É Postgresql
  • Primeira possível solução cabível
  • Melhor saída pra manter o Django "OK"

instalando



# Terminal$ pip install -e \ django-hstore-flattenfields \ git+git://github.com/multmeio/django-hstore

configurando FLATTENFIELDS


# settings.pyDATABSES = { 'default': { 'engine':   'django_hstore.postgresql_psycopg2', ... }}PG_VERSION = (9, 1)

CONFIGURANDO FLATTENFIELDS


# settings.py
INSTALLED_APPS = ( ... 'hstore_flattenfields',   'django_hstore', ...
)

Model com flattenfields



# models.pyfrom django.db import modelsfrom hstore_flattenfields.models import *
class Person(HStoreModel): name = models.CharField(max_lenght=100)

Tabela COM HSTORE


+----------------------------------------+ | tabela | +----------------------------------------+ | ID | NAME | campo_hstore | | 1 | 'JESUS' | {'RG':'19216801'} | | 2 | 'MARIA' | {'SEXO':'F'} | | 3 | 'JOSE' | {'IDADE':'21'} | +----------------------------------------+

filter(idade__gte=21)



>>> Person.objects.count()
10>>> Person.objects.filter(idade__gte=21).count()
3>>> Person.objects.exclude(idade__lt=21).count()
7

values('data_nasc')



>>> Person.objects.values('data_nasc')[{'data_nasc': datetime.date(2013, 7, 26)}]
>>> Book.objects.values('author__data_nasc')
[{'data_nasc': datetime.date(2013, 7, 26)}]

aggregations



from hstore_flattenfields.db import aggregates
>>> Book.objects.aggregate(  aggregates.HstoreSum('pages'),  aggregates.HstoreAvg('pages'))[{'pages__avg': 3, 'pages__sum': 28}]

integração



>>> from model_mommy import mommy>>> b = mommy.make(Book, pages=22)>>> b.pages22


talk is cheap 

show me the code


     >_ github.com/luanfonceca/pybr

Campos dinâmicos sem NoSql

By Luan Fonseca de Farias