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
# 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)
# settings.pyDATABSES = { 'default': { 'engine': 'django_hstore.postgresql_psycopg2', ... }}PG_VERSION = (9, 1)
CONFIGURANDO FLATTENFIELDS
# settings.py
INSTALLED_APPS = ( ... 'hstore_flattenfields', 'django_hstore', ...
)
# 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)
# 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'} |
+----------------------------------------+
+----------------------------------------+
| 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)}]
>>> 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}]
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
>>> 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
Campos dinâmicos sem NoSql
- 3,161