Calculando porcentagem no Django 1.7

159 views
Skip to first unread message

Régis Silva

unread,
May 5, 2015, 11:27:30 PM5/5/15
to curso-d...@googlegroups.com, django...@googlegroups.com, welcome-to...@googlegroups.com
from myproject.core.models import Person
from django.db.models import Count

''' porcentagem de gender '''
g = Person.objects.values('gender').annotate(perc=Count('gender')).order_by('gender').values('gender', 'perc')
t = Person.objects.count()

Retorna

[{'gender': 'F', 'perc': 110}, {'gender': 'M', 'perc': 90}]
200 # total

Mas eu queria

[{'gender': 'F', 'perc': 0.55}, {'gender': 'M', 'perc': 0.45}]

Eu tentei de tudo, em relação as combinações de cálculo, mas não consegui, dai eu pensei:
"E se eu fizer o cálculo separado e jogar no contexto?"

OK, mas como eu faço isso?

Ah, estou usando Django 1.7

Regis da Silva / Web Developer 
regis ponto santos ponto 100 at gmail ponto com

Linkedin GitHub Google Plus Twitter

Lúcio Corrêa

unread,
May 5, 2015, 11:46:24 PM5/5/15
to django...@googlegroups.com
Você tem várias opções: criar um manager com um método que retorna isso num método, criar um método static no próprio model, calcular as porcentagens e jogar num RequestContext() dentro da view, ou até mesmo criar uma lista com esse mesmo formato que você quer e usar o shortcut render().





--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Lúcio Flávio Corrêa
@luciofcorrea

Régis Silva

unread,
May 5, 2015, 11:55:29 PM5/5/15
to Julio Cesar Eiras Melanda, welcome-to...@googlegroups.com, curso-d...@googlegroups.com, django...@googlegroups.com
Tudo bem em fazer no backend,
mas eu não estou conseguindo calcula de uma forma simples,
tudo que eu vi na internet é um pouco complicado, eu até tentei:

g = Person.objects.filter(gender='M').count()
t = Person.objects.count()
g/t

e idem para gender='F'

Mas eu acho que ficou muito manual e eu não sei como eu jogaria isso num contexto para ser renderizado (o resultado) num template...




Regis da Silva / Web Developer 
regis ponto santos ponto 100 at gmail ponto com

Linkedin GitHub Google Plus Twitter


Em 6 de maio de 2015 00:52, Julio Cesar Eiras Melanda <jceme...@gmail.com> escreveu:

O cálculo de porcentagem não será feito no banco, mas no backend.

Não entendi realmente qual a dúvida.

Julio Cesar Eiras Melanda
-------------------------------------------------------------------------------------
Universidade Federal de São Paulo
Mestrando em Ciência da Computação

Universidade Federal de Itajubá
Bacharel em Ciência da Computação
-------------------------------------------------------------------------------------
Google Talk: jceme...@gmail.com
Skype: jcemelanda
cel/whatsapp: (012) 99150-7808
-------------------------------------------------------------------------------------
blog: http://programeempython.blog.br

github: https://github.com/julioeiras
slideshare: http://www.slideshare.net/jcemelanda

-------------------------------------------------------------------------------------
twitter: @jcemelanda
identi.ca @jcemelanda
-------------------------------------------------------------------------------------
Linux user: #498290
Fedora User

--
Você recebeu essa mensagem porque está inscrito no grupo "Curso de Django" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para curso-de-djan...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para curso-d...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/curso-de-django/CA%2BDznZNNkzeVG2PaVRnDcTgrDr4Uj34ezweRYZ5r9w-9F_z4XA%40mail.gmail.com.

Régis Silva

unread,
May 6, 2015, 11:58:50 PM5/6/15
to Julio Cesar Eiras Melanda, welcome-to...@googlegroups.com, curso-d...@googlegroups.com, django...@googlegroups.com
Resolvido:

from myproject.core.models import Person
from django.db.models import Count

''' porcentagem de gender '''
genders = Person.objects.values('gender').annotate(cnt=Count('gender')).order_by('gender')
total_items = Person.objects.count()
items = [{'gender': g['gender'], 'value': g['cnt'] * 100 / total_items} for g in genders]


Pau no gato


Regis da Silva / Web Developer 
regis ponto santos ponto 100 at gmail ponto com

Linkedin GitHub Google Plus Twitter


Régis Silva

unread,
May 7, 2015, 12:54:26 AM5/7/15
to Julio Cesar Eiras Melanda, welcome-to...@googlegroups.com, curso-d...@googlegroups.com, django...@googlegroups.com
Vejam os resultados





Regis da Silva / Web Developer 
regis ponto santos ponto 100 at gmail ponto com

Linkedin GitHub Google Plus Twitter


Guilherme Carvalho

unread,
May 7, 2015, 3:34:51 PM5/7/15
to django...@googlegroups.com

Atenciosamente,

Guilherme de Carvalho Carneiro
Analista de sistemas
twitter: @GCarneiro
http://djangopeople.net/guilhermecarvalho/

2015-05-06 0:27 GMT-03:00 Régis Silva <regis.sa...@gmail.com>:

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.

Régis Silva

unread,
May 8, 2015, 7:48:47 AM5/8/15
to django...@googlegroups.com
É impressionante o mecanismo de busca do Google né?
Guilherme, associou o nome a pessoa? rsrsrs
Valeu

Mário Neto

unread,
May 8, 2015, 9:51:37 AM5/8/15
to django...@googlegroups.com
Já que o .count() faz outra query SELECT COUNT(*), não seria melhor fazer esse calculo com os valor que já temos em mão, como por exemplo:

format_result = lambda g: {
    'gender': g['gender'], 'value': g['cnt'] * 100 /
    sum([x['cnt'] for x in genders])
}

items = [format_result(g) for g in genders]
--
Att. Mário Araújo Chaves Neto
Programmer, Designer and U.I. Engineer

MBA in Design Digital - 2008 - FIC
Analysis and Systems Development - 2011 - Estácio
Design and Implementation of Internet Environments - 2003 - FIC
Reply all
Reply to author
Forward
0 new messages