USANDO SUM E GROUP BY NO DJANGO

740 views
Skip to first unread message

prygb...@gmail.com

unread,
Jun 30, 2009, 8:40:03 AM6/30/09
to Django Brasil
Oii,

Gente estou em dúvidas como montar uma tabela no meu template com os
nomes dos usuarios e o total de paginas que eles tem, tipo, preciso
usar a funcao "SUM" no campo pagina e o "GROUP BY" pq são vários
registros do mesmo usuário, mas não estou conseguindo, será q alguém
pode me ajudar, ou tem uma idéia prática de fazer isso?

Obrigada.


Sérgio Durand

unread,
Jun 30, 2009, 11:33:04 AM6/30/09
to django...@googlegroups.com
Oi,

Primeiro você vai precisar estar com a versão do svn do Django (ex: 1.1 beta 1 SVN-11091)

Depois é só dar uma lida na respectiva documentação[1] que lá tem tudo o que você precisa saber sobre as funções de agregação, inclusive com exemplos práticos. Se você ler essa documentação e ainda assim tiver encontrando algum problema, manda a sua dúvida aqui pra lista que o pessoal pode ajudar!

Se você só puder usar a versão estável (v1.0.2), então eu acho que a saída seria usar Raw SQL[2].

[1] http://docs.djangoproject.com/en/dev/topics/db/aggregation/
[2] http://docs.djangoproject.com/en/dev/topics/db/sql/

Boa sorte,

Sérgio Durand


prygb...@gmail.com

unread,
Jul 10, 2009, 9:15:19 AM7/10/09
to Django Brasil

Obrigada sergio, porém, quando vou importar (from django.db.models
import Avg) qualquer funcão de agrecacão eu tenho o seguinte erro:

ImportError: cannot import name Avg

Porque acontece isso? É de versão?

Priscila.

Sérgio Durand

unread,
Jul 10, 2009, 10:09:10 AM7/10/09
to django...@googlegroups.com
Você deve estar com a versão 1.0.2 do django.
Para usar essas funções você precisa da versão 1.1, ainda beta, (voce pode pegar pelo svn)

Executa aí o seguinte:

django-admin.py --version

o retorno precisa ser algo do tipo:
"1.1 beta 1 SVN-11203"

Até mais,
Sérgio Durand

wancharle sebastiao quirino

unread,
Jul 10, 2009, 1:48:54 PM7/10/09
to django...@googlegroups.com
O django é framework e foi criado para eliminar na "maioria" das vezes funções como group by e sum.

o seu problema é resolvido usando o orm do django (versão normal e estavel).

No seu caso se cada pagina tem um referencia para o usuario basta usar o seguinte:
--- na view seria assim ---
user = User.objects.get(.....) # obtem o usuario desejado
sum = user.paginas_set.count()

-- no template seria assim ---
{% for u in meus_users %}
    <tr><td>{{u.username}}</td><td>{{ u.paginas_set.count }}</td></tr>
{%endfor%}

"paginas_set" é uma relação criada do usuario com o model "Paginas"
se  o nome do seu model for "Webpages" entao o set seria "webpages_set"
A documentação desse recurso está em:
 http://docs.djangoproject.com/en/dev/topics/db/queries/#related-objects

Para o seu problema a justificativa para usar "sum" seria otimização(pois ele usa o "for" do banco em vez do "for" do python ), em outros problemas mais complexos que precisem de sql puro ai sim talvez voce precise usar funcoes de agregaçao(mas quase sempre é possivel converter para o orm)...



prygb...@gmail.com

unread,
Jul 10, 2009, 3:30:59 PM7/10/09
to Django Brasil

Assim funciona sebastiao, porém mostrando a quantidade de registros
que o usuário tem na tabela.
O que eu quero é somar os valores que tem no campo "paginas" referente
ao usuário e me retorne o valor total.

Obrigada!

prygb...@gmail.com

unread,
Jul 13, 2009, 3:20:40 PM7/13/09
to Django Brasil

Sérgio consegui!

Baixei a versão, fiz uns testes e funciona na boa, porém, só um
problema agora...

Eu usei da seguinte forma na view:

lista_registros = Impressoes.objects.values('usuario').annotate
(sum_paguna=Sum('pagina'))

Como resultado eu tenho numa table do template o "id" do usuario e o
total de paginas que ele possui. Gostaria que ao invés de retornar o
"id" do usuário retornasse o nome que está no models "User".

Tenho a seguinte funcao no models impressoes, mas neste caso
especifico de agregacão nao funciona se eu for chamar no template:

def getUsuario(self):
usuario = get_object_or_404(User,id=self.usuario_id)
return usuario.username


O que acontece?


Muito Obrigada!

Priscila
Reply all
Reply to author
Forward
0 new messages