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
tabela
where
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.py
DATABSES = {
'default': {
'engine':
'django_hstore.postgresql_psycopg2',
...
}
}
PG_VERSION = (9, 1)
# settings.py
DATABSES = {
'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.py
from django.db import models
from hstore_flattenfields.models import *
class Person(HStoreModel):
name = models.CharField(max_lenght=100)
# models.py
from django.db import models
from 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.pages
22
>>> from model_mommy import mommy
>>> b = mommy.make(Book, pages=22)
>>> b.pages
22
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
- 2,775