Foros del Web » Programando para Internet » Python »

queryset con django

Estas en el tema de queryset con django en el foro de Python en Foros del Web. hola que tal !!! estoy haciendo una web que me muestra estadisticas anuales mensuales y semanales la cosa es ke puedo mostrar dichas alertas pero ...

  #1 (permalink)  
Antiguo 24/01/2011, 07:55
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
queryset con django

hola que tal !!! estoy haciendo una web que me muestra estadisticas anuales mensuales y semanales la cosa es ke puedo mostrar dichas alertas pero en total usando vistas genericas ... pero necesito hacer consultas mas especificas de las alertas de digamos un proyecto y ademas cada proyecto tiene varios componentes y pues de igual forma de ambos necesito hacer las consultas de las alertas x ano mes y dia ...
ya le di muchas vueltas la pregunta es como lo hago pues se que haciendolomcon vistas genericas se puede masndando a filtrar el queryset pero lo e hecho y x la relacion que hay entre proyectos y componentes pues me envia un error diciendo que no existe componente o proyecto ... bueno espero me entiendan y me ayuden gracias
  #2 (permalink)  
Antiguo 24/01/2011, 08:52
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

¿Dónde está el código de la vista? ¿dónde está el mensaje de error?
  #3 (permalink)  
Antiguo 24/01/2011, 09:13
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

lo que dice el error es name 'componente' is not defined

con repecto a la vista no te la mando porque no me parece necesario pues mi problema creo esta en url

Código Python:
Ver original
  1. alerta_info = {
  2.     'queryset': Alerta.objects.filter(componente__nombre = componente),
  3.     'date_field': 'fecha',
  4.    
  5. }
  6.  
  7. urlpatterns = patterns('',
  8.     #(r'^admin/', include(admin.site.urls)),
  9.     (r'^aplicacion/$', 'aplicacion.views.index'),
  10.     (r'^aplicacion/(?P<proyecto>\w+)/$', 'aplicacion.views.componentes'),
  11.     (r'^aplicacion/(?P<proyecto>\w+)/(?P<componente>\w+)/$', 'aplicacion.views.alertas'),
  12.     (r'^aplicacion/\w+/\w+/(?P<year>\d{4})/$','django.views.generic.date_based.archive_year',  alerta_info),
  13.     (r'^aplicacion/\w+/\w+/(?P<year>\d{4})/(?P<month>[a-z]{3})/$','django.views.generic.date_based.archive_month',  alerta_info),
  14.     (r'^aplicacion/\w+/\w+/(?P<year>\d{4})/(?P<week>\d{2})/$','django.views.generic.date_based.archive_week',  alerta_info),

esto es lo que tengo ay y pues creo que el error esta en el query set aunque si le digo all me lo muestra todo pero como dije necesito la consulta por componente ... estos son mis modelos por si acaso y pues en la vistas solo mande a listar digamos proyecto , de proyecto a conmponente y de componente a alertas y pues si me muestra las alertas en especifico del componente pero no se como hacerlo por mes año y semana

modelos

Código Python:
Ver original
  1. from django.db import models
  2. from datetime import datetime
  3.  
  4. class Proyecto(models.Model):
  5.     nombre = models.CharField(max_length=200)
  6.    
  7.     def __unicode__(self):
  8.         return self.nombre
  9.        
  10. class Componente(models.Model):
  11.     proyecto = models.ForeignKey(Proyecto)
  12.     nombre = models.CharField(max_length=200)
  13.    
  14.     def __unicode__(self):
  15.         return self.nombre
  16.  
  17. class Alerta(models.Model):
  18.     componente = models.ForeignKey(Componente)
  19.     alertas = models.PositiveIntegerField()
  20.     fecha = models.DateField(editable=False)
  21.    
  22.     def save(self):
  23.         if not self.id:
  24.             self.fecha = datetime.today()
  25.         super(Alerta, self).save()
  26.  
  27.     def __unicode__(self):
  28.         return "%s - %s" % (self.fecha, self.alertas)

Última edición por AlvaroG; 24/01/2011 a las 11:16 Razón: resaltado de código
  #4 (permalink)  
Antiguo 24/01/2011, 11:21
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

name 'componente' is not defined... me suena a que sale por el código de la línea 2 del primer bloque, ¿de dónde sale la variable componente?

El filtro debería estar en la vista, es perfectamente posible crear una vista que pase los datos a una vista genérica. Después de todo, las vistas no son más que funciones. Ahora mismo no tengo el código, pero me anoto para darte un ejemplo luego. Mientras tanto, busca en el gúguel.


Saludos.
  #5 (permalink)  
Antiguo 25/01/2011, 11:55
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

e pos creo ke lo puedo hacer enviandole en extra_context un list de componentes y en el query hacer un list pero de alertas y pos filtrarlo en la vista aun no lo e hecho pero suena mas logico que lo ke ya tengo igual y graxxx ... de toas form sigo pasando a ver si hay una resp nueva
  #6 (permalink)  
Antiguo 25/01/2011, 18:35
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

eee bueno creo ke sigo necesitando ayuda xke lo ke hice no me funciona ...
  #7 (permalink)  
Antiguo 25/01/2011, 20:46
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Demorado, pero acá está el ejemplo que te prometí antes. No prometo que funcione, porque es un código que yo usé en su momento y ahora eliminé algunas cosas, pero la idea debe quedar.

La idea es filtrar los objetos en la vista, y luego llamar a la vista genérica con los parámetros que requiera:

Código Python:
Ver original
  1. def una_vista_de_detalle(request, f):
  2.     objetos_filtrados = Objeto.objects.filter(filtro=f)
  3.  
  4.     return list_detail.object_detail(
  5.         request,
  6.         queryset = objetos_filtrados,
  7.     )
  #8 (permalink)  
Antiguo 26/01/2011, 09:21
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

emmmm grax lo intentare ... y pues sera ke me ayudas con algo mas es ke en la class alerta acabo de agregar una fk de proyecto .... la coss es ke necesito limitar esos modelos pa ke cuando sea un preoyecto sea especifico su componente pues peden existir otros preoyectos con el mismo componente y eso me dari errores al graficar graxx
  #9 (permalink)  
Antiguo 26/01/2011, 10:59
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

No he entendido el problema, descríbelo de forma más detallada.

Me faltó aclarar en el ejemplo, que list_detail.object_detail (la función cuyo valor se devuelve) es una de las vistas genéricas.


saludos.
  #10 (permalink)  
Antiguo 26/01/2011, 13:26
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

hola !!... pues nada sabes ke te mande los modelos bueno en la ultima clase nesectito limitarla de ta forma de no se me vaya a pasar un componente incorrecto al proyecto eso fue lo ke me dijero pero la verdad tampoco le encuentro mucho sentido ....

por otro lado sabes quemi url se decribe asi va mi app/proyecto/componente/alertas
de tal forma ke en mi app esta una lista de mis proyectos selecciono uno y me sale en app/proyecto/ una list de mis componentes y al seleccionar un componente es decir en app/proyecto/componente me muestra mis alertas la coss es ke cuando estoy en este ultimo se me pierde mi proyecto y no se por que te voy a mandar mi vistas a ver ....

def index(request):
proyecto_list = Proyecto.objects.all().order_by('id')
return render_to_response('aplicacion/index.html', {'proyecto_list': proyecto_list})

def componentes(request, proyecto):
componente_list = Componente.objects.filter(proyecto__nombre = proyecto)
return render_to_response('aplicacion/componentes.html', {'componente_list': componente_list})

def alertas(request, proyecto, componente):
alerta_list = Alerta.objects.filter(componente__nombre = componente )
return render_to_response('aplicacion/alerta.html', {'alerta_list': alerta_list})

y pues en mis templates no hay mas ke un repita ke me recorre mi listas
  #11 (permalink)  
Antiguo 26/01/2011, 19:58
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

¿cómo que "se pierde mi proyecto"? no entiendo qué querés decir con eso, pero lo que veo es que los datos del proyecto no están siendo pasados a la plantilla, solamente las alertas. Pásale 'proyecto' en el diccionario extra_context


Saludos.
  #12 (permalink)  
Antiguo 31/01/2011, 09:05
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

pues eso mismo ke escribiste lo ke pasa es ke tiendo a ser complicada !!! pero si te das cuenta no todas mis vistas son digamos ni geneicas ni detail list total ke se puede pasar un extra context en una vista normal ??? como lo hago pues averigue pero ps no se !!! grax sabes me has servido de gran ayuda sobretodo por ke no conosco sino solo a una persona cercana ke use django y todos los dias tengo una pregunta diferente y pues esta persona es mi tutor y no siempre tiene tiempo ademas ke tiende no a decrime sino a kitarme del compu y hacerlo ... en fin muchas gracias !!!

Última edición por ichibi; 31/01/2011 a las 12:47
  #13 (permalink)  
Antiguo 31/01/2011, 16:17
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Ante la duda, siempre ir al manual http://docs.djangoproject.com/en/dev...ttp/shortcuts/

el segundo parámetro de render_to_response es un diccionario de contexto, podés agregar las variables que necesites allí:
Código Python:
Ver original
  1. return render_to_response('aplicacion/alerta.html', {'alerta_list': alerta_list, 'proyecto': proyecto})


Saludos.
  #14 (permalink)  
Antiguo 01/02/2011, 09:56
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

mmmmmmmmmmm pues en realidad sigue sin funcionar .... sigue sin cargar el nombre del proyecto en el url weee si se te ocurre algo mas !!!... mientras sigo intentando
  #15 (permalink)  
Antiguo 01/02/2011, 11:28
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

¿y la plantilla? es lo único que falta revisar
  #16 (permalink)  
Antiguo 01/02/2011, 11:59
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

{% if proyecto_list %}
<ul>
{% for proyecto in proyecto_list %}
<li><a href="/aplicacion/{{ proyecto.nombre }}/">{{ proyecto.nombre }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No chirve</p>
{% endif %}

esta es de proyecto

{% if componente_list %}
<ul>
{% for componente in componente_list %}
<li><a href="/aplicacion/{{ proyecto.nombre }}/{{ componente.nombre }}/">{{ componente.nombre }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No chirve</p>
{% endif %}

esta de componente en esta es donde se me va el nombre del preoyecto y no me muestra la url completa



el no chirve jajajaja era por si estaba usando la list de objetos ekibocada _!!!!
  #17 (permalink)  
Antiguo 01/02/2011, 17:59
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Se me ocurre que quizás modificaste solamente la vista que te puse de ejemplo, y no las otras. Estas plantillas que pusiste no corresponden a la vista que te modifiqué antes.

Si de todas formas estás pasando proyecto, y proyecto.nombre queda vacío, quizás el problema es que proyecto no tiene un atributo nombre


saludos
  #18 (permalink)  
Antiguo 01/02/2011, 19:51
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

si vez los modelos si tiene un atributo nombre ....

si son los templates el primero es de proyecto y el segundo es de los componentes no te muestro el de las alertas pues ya de hay no hay mas enlaces !!!


y pues no es mas modifique la vista de proyecto y la de componente y no la de alerta pues como te dije de componentes no hay mas enlaces !!!

igual grax voy a revisar de nuevo lo que hise !!!
  #19 (permalink)  
Antiguo 02/02/2011, 12:16
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

Cita:
Iniciado por AlvaroG Ver Mensaje
Demorado, pero acá está el ejemplo que te prometí antes. No prometo que funcione, porque es un código que yo usé en su momento y ahora eliminé algunas cosas, pero la idea debe quedar.

La idea es filtrar los objetos en la vista, y luego llamar a la vista genérica con los parámetros que requiera:

Código Python:
Ver original
  1. def una_vista_de_detalle(request, f):
  2.     objetos_filtrados = Objeto.objects.filter(filtro=f)
  3.  
  4.     return list_detail.object_detail(
  5.         request,
  6.         queryset = objetos_filtrados,
  7.     )


me podrias esplicar mejor este ejemplo !!!
disculpa la molestia
  #20 (permalink)  
Antiguo 03/02/2011, 05:09
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Como escribí en ese mismo mensaje: Es solamente un ejemplo simple de una vista genérica (list_detail.object_detail) que hace el filtrado en la vista misma y no en urls.py

No es molestia ayudar, pero no me estás dando los elementos como para hacerlo. ¿has modificado tu código como te lo sugerí? ¿cómo quedó luego de esas modificaciones? ¿cuál es el problema que tenés ahora mismo?

Por favor tomate unos minutos para redactar bien y en forma explícita la situación, realmente hay cosas que no te entiendo y no me quedan claras, parece que escribís apurado.


Saludos.
  #21 (permalink)  
Antiguo 11/02/2011, 13:10
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

que tal pues si quisas tengas razon al respecto e modificado gran parte de mi codigo pues pra optimiza decidi usar vitas genericas y pues con respecto al problema que tenia en la url que se me perdia el nombre del proyecto ya esta solucionado gracias a las vistas genericas lo hice con herencia...

ahora mismo solo necesito mostrar mis componentes por las fechas de semana mes y año hasta donde se creo debo hacer una vista pero no se como !!!! te envio mis nuevos models.py

from django.db import models
from datetime import datetime

class Proyecto(models.Model):
nombre = models.CharField(max_length=200)

def __unicode__(self):
return self.nombre

class Componente(models.Model):
proyecto = models.ForeignKey(Proyecto)
nombre = models.CharField(max_length=200)

def __unicode__(self):
return self.nombre

class Alerta(models.Model):
proyecto = models.ForeignKey(Proyecto)
componente = models.ForeignKey(Componente)
alertas = models.PositiveIntegerField()
fecha = models.DateField(editable=False)

def save(self):
if not self.id:
self.fecha = datetime.today()
super(Alerta, self).save()

def __unicode__(self):
return "%s - %s" % (self.fecha, self.alertas)



mis nuevas urls.py

from django.views.generic import date_based
from aplicacion.models import Proyecto, Alerta, Componente

from django.contrib import admin
admin.autodiscover()

proyecto_info = {
'queryset' : Proyecto.objects.all(),
}

alerta_info = {
'queryset': Alerta.objects.all(),
'date_field': 'fecha',
'extra_context': { 'componentes': Componente.objects.all()},
}

urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^aplicacion/$', 'django.views.generic.list_detail.object_list', proyecto_info),
(r'^aplicacion/(?P<proyecto>\w+)/$', 'aplicacion.views.componente'),
(r'^aplicacion/(?P<proyecto>\w+)/(?P<componente>\w+)/$', 'aplicacion.views.alerta')

y mis nuevas vistas

from aplicacion.models import Proyecto, Componente, Alerta
from django.views.generic.list_detail import object_list

def componente(request, proyecto):
components = Componente.objects.filter(proyecto__nombre = proyecto)
return object_list(request, queryset=components, extra_context = {'project': proyecto})

def alerta(request, proyecto ,componente ):
alerts = Alerta.objects.filter(componente__nombre = componente, proyecto__nombre = proyecto )
return object_list(request, queryset=alerts, extra_context = {'project': proyecto})


estoy muy trancada en esto porque no se como hacerlo te voy a explicar de nuevo por si acaso lo que puedo hacer hasta ahora es mostrar las alertas por componente ...pero lo que necesito es mostrar las alertas por componente segun semanas mes y años por eso la exixtencia de la fecha en la tabla alerta ... bueno espero que con toda esta informacion si me puedas ayudar y disculpa por lo redactar bien las anteriores veces
  #22 (permalink)  
Antiguo 11/02/2011, 15:13
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

No debería ser complicado: simplemente crear una nueva regla para la URL y filtrar tus resultados según el criterio pasado.

Como se explica por acá
http://docs.djangoproject.com/en/dev/topics/db/queries/

con tu campo de tipo DateField podés seleccionar objetos con fecha Diciembre haciendo esto:
Alerta.objects.filter(fecha__month=12)

Luego una regla de URL como
(r'^aplicacion/(?P<proyecto>\w+)/(?P<componente>\w+)/(?P<mes>\d{1,2}/$', 'aplicacion.views.alerta')

Debería ser suficiente para tener un ejemplo sencillo en marcha.


Saludos.
  #23 (permalink)  
Antiguo 14/02/2011, 12:52
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

sera posible digamos con el queryset de alerta que ya tengo ... importar la fecha de hoy y mostrar por ejemplo las ultimas 2 semanas pero bueno como se le dicen que sean las ultimas 2 semanas ... es con timedelta???
  #24 (permalink)  
Antiguo 15/02/2011, 05:46
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Pues sí, de hecho en la página que te pasé hay un ejemplo que te debería ser fácil adaptar
Código Python:
Ver original
  1. from datetime import timedelta
  2. Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
  #25 (permalink)  
Antiguo 16/02/2011, 20:06
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

perdon ... me tomaras por lenta pero es que no entiendo !!!! disculpame encerio
  #26 (permalink)  
Antiguo 17/02/2011, 05:27
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

¿leíste la página? Porque al ponerte solamente dos líneas de código mi intención era que la leyeras
Bueno, en definitiva la idea es que hagas algo como esto:

Código Python:
Ver original
  1. TuClase.objects.filter(tu_campo_fecha__operador=F('tu_campo_fecha') + timedelta(days=la_diferencia_que_quieras)
Recordá que tenés que importar F (función que te permite referenciar a campos del modelo) y timedelta (no te digo de dónde, para forzarte a que leas la página que te sugerí).

En tu caso, la forma genérica de arriba se traduce a:
Código Python:
Ver original
  1. Alerta.objects.filter(fecha__gte=F('fecha') - timedelta(weeks=2))
Es decir, "objetos de tipo Alerta tales que su fecha es mayor o igual a su fecha menos 2 semanas". ¿A que es simple una vez que se sabe cómo hacerlo?
Nota: "gte" es "greater than or equal", es decir, "mayor o igual que"


Saludos.
  #27 (permalink)  
Antiguo 17/02/2011, 12:49
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

gracias es que mmm me cuesta un poco el ingles y pues nada los traductoreas no siempre son tan buenos ... gracias !!!
  #28 (permalink)  
Antiguo 17/02/2011, 12:54
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

No hay problema, está bueno que digas que no te llevás bien con el inglés, así ya sé que tengo que escribir un poco más jeje.
Disculpa pero es que los que hace algún tiempo que estamos en foros a veces somos un poco reacios a dar todo hecho, debido a la gran cantidad de gente que aparece pidiendo (a veces casi exigiendo) que se le haga la tarea.


Saludos, y no dudes en preguntar si sigue sin funcionar.
  #29 (permalink)  
Antiguo 18/02/2011, 07:20
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: queryset con django

No traquilo jamas exigiria y menos si me estan ayudadndo ademas que te lo hagan no es una ayuda es una maldad ... por eso estoy tan agradecida y pues que no se entere nadie pero eres mejor que mi tutor jajajaja

hey mmmm sabes ke lo hise pero no me servia asi ke decidi correrlo en el shell y pues esta bien hasta que
sale un error pero intentare solucionarlo mientras >>> from datetime import timedelta
esto fue lo que hise...

>>> from django.db.models import F
>>> from aplicacion.models import Proyecto, Componente, Alerta
>>> qs= Alerta.objects.filter(proyecto__nombre='Proyeto1', componente__nombre='guardar')
>>> alerta_list= qs.filter(fecha__gte=('fecha') - timedelta(weeks=5))
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'datetime.timedelta'
>>> alerta_list= qs.filter(fecha__gte=('fecha') - timedelta(weeks=5))



lo que no se es por que quiere un str y pues digamos que es por la fecha que no esta en puros digito ... entonces hay algo strftime() and strptime() que trabaja con string pero afff no se creo que me estoy confundiendo !!!

Última edición por ichibi; 18/02/2011 a las 10:16
  #30 (permalink)  
Antiguo 18/02/2011, 11:02
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: queryset con django

Aquí hay dos problemas:
1.- cuando le das a Python una expresión de la forma
("hola")
(es decir: tupla de un elemento, ese elemento es la cadena "hola") El intérprete lo transformará directamente a "hola", eliminará la tupla.

2.- Te olvidaste de F("fecha") y simplemente lo pusiste como ("fecha"), por lo que queda como
"hola" - timedelta(weeks=5)

Y es ahí donde Python te dice que no puede restar un timedelta a una cadena.


Saludos.

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:59.