Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Como trabajar con los objetos de models.py en django

Estas en el tema de Como trabajar con los objetos de models.py en django en el foro de Python en Foros del Web. Hola todos. Soy un novato en Django. Tal vez la respuesta a esto sea obvia :P. Quisiera saber como poder trabajar con los objetos que ...
  #1 (permalink)  
Antiguo 29/10/2013, 15:53
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
Como trabajar con los objetos de models.py en django

Hola todos. Soy un novato en Django. Tal vez la respuesta a esto sea obvia :P.

Quisiera saber como poder trabajar con los objetos que se obtienen en una clase de models.py.

Lo que estoy haciendo:

En models.py tengo una clase con las variables de clase campo1 y campo2
Código:
class Prueba(models.Model):
	fecha = models.DateField(auto_now_add=False)
	campo1 = models.IntegerField(null=True)
	campo2 = models.IntegerField(null=True)
        def __unicode__(self): 
        ...
en views.py tengo:

Código:
 from django.http import HttpResponse
from hsemanales.models import Prueba
from django.template import Context, loader

def main(request):
	suma = int(Prueba.campo1) + int(Prueba.campo2)
	t = loader.get_template('main.html')
	c = Context({'suma': suma})
	return HttpResponse(t.render(c))
y bueno, en main.html trato de insertar la suma de campo1 y campo2.
Pero al correr el servidor y visitar ..main/ me da el error de que Prueba no tiene como atributo campo1.

En resumen, no se como trabajar con estas variables obtenidas de la base de datos en models.py
  #2 (permalink)  
Antiguo 29/10/2013, 23:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Como trabajar con los objetos de models.py en django

Código Python:
Ver original
  1. # models.py
  2. class Prueba(models.Model):
  3.     fecha = models.DateField(auto_now_add=False)
  4.     # Ok, por favor nunca nombre tus variables con 1, 2, hasta n
  5.     # Si es solo para aprender esta bien
  6.     # Pero por favor nunca lo hagas en un proyecto real
  7.     campo1 = models.IntegerField(null=True)
  8.     campo2 = models.IntegerField(null=True)
  9.  
  10.     def suma(self):
  11.         # Obviamente saltara una excepcion si campo1 o campo2
  12.         # son null en la db (y por lo tanto None en python)
  13.         return self.campo1 + self.campo2
  14.  
  15. # views.py
  16. from django.shortcuts import render_to_response
  17. from hsemanales.models import Prueba
  18. from django.template import RequestContext
  19.  
  20. def home(request): # Por favor pon nombres descriptivos
  21.     # Objeto creado en memoria
  22.     # No sera guardado en la db hasta que se lo indiques
  23.     # Ojo aqui nunca le indico que lo guarde
  24.     prueba = Prueba(campo1=10, campo2=20)
  25.     return render_to_response('home.html',
  26.                           {'prueba': prueba},
  27.                           context_instance=RequestContext(request))

Y en nuestra plantilla:
Código HTML:
Ver original
  1. {# En alguna parte de nuestra plantilla #}
  2. {{ prueba.suma }}

El problema es parece que no entiendes el concepto de base de datos y tampoco el de ORM. Lo cual si vas empezando es mas que comprensible que no lo sepas así que aquí va.

Un modelo lo puedes visualizar como si fuera una tabla en tu db. Y cada atributo que defines es un campo en tu tabla. Si quieres hacer una operación sobre un campo o mas campo en un solo registro lo puedes hacer por medio de un método.

Otra cosa, te recomiendo leer sobre django, hay un motón de documentación de calidad en la pagina oficial. https://docs.djangoproject.com/en/1.5/

Si lo quieres en español puedes buscar en google y te encontraras con muchos materiales pero la verdad no me atrevo a recomendarlos porque nunca he checado su calidad.
  #3 (permalink)  
Antiguo 05/11/2013, 21:57
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
Respuesta: Como trabajar con los objetos de models.py en django

Cita:
Iniciado por razpeitia Ver Mensaje
Código Python:
Ver original
  1. # models.py
  2. class Prueba(models.Model):
  3.     fecha = models.DateField(auto_now_add=False)
  4.     # Ok, por favor nunca nombre tus variables con 1, 2, hasta n
  5.     # Si es solo para aprender esta bien
  6.     # Pero por favor nunca lo hagas en un proyecto real
  7.     campo1 = models.IntegerField(null=True)
  8.     campo2 = models.IntegerField(null=True)
  9.  
  10.     def suma(self):
  11.         # Obviamente saltara una excepcion si campo1 o campo2
  12.         # son null en la db (y por lo tanto None en python)
  13.         return self.campo1 + self.campo2
  14.  
  15. # views.py
  16. from django.shortcuts import render_to_response
  17. from hsemanales.models import Prueba
  18. from django.template import RequestContext
  19.  
  20. def home(request): # Por favor pon nombres descriptivos
  21.     # Objeto creado en memoria
  22.     # No sera guardado en la db hasta que se lo indiques
  23.     # Ojo aqui nunca le indico que lo guarde
  24.     prueba = Prueba(campo1=10, campo2=20)
  25.     return render_to_response('home.html',
  26.                           {'prueba': prueba},
  27.                           context_instance=RequestContext(request))

Y en nuestra plantilla:
Código HTML:
Ver original
  1. {# En alguna parte de nuestra plantilla #}
  2. {{ prueba.suma }}

El problema es parece que no entiendes el concepto de base de datos y tampoco el de ORM. Lo cual si vas empezando es mas que comprensible que no lo sepas así que aquí va.

Un modelo lo puedes visualizar como si fuera una tabla en tu db. Y cada atributo que defines es un campo en tu tabla. Si quieres hacer una operación sobre un campo o mas campo en un solo registro lo puedes hacer por medio de un método.

Otra cosa, te recomiendo leer sobre django, hay un motón de documentación de calidad en la pagina oficial. [url]https://docs.djangoproject.com/en/1.5/[/url]

Si lo quieres en español puedes buscar en google y te encontraras con muchos materiales pero la verdad no me atrevo a recomendarlos porque nunca he checado su calidad.


Muchas gracias Razpeitia por tu respuesta. De hecho cambie la distribución de mi modelo y mis views como me lo recomiendas y ya no me da el error. Ahora tengo otro problema, que es el mismo que parece que no termino de solucionar.

En models.py cree un método que suma los dos campos. El problema es que siempre son cero, creo que es porque no me estoy comunicando con la base de datos bien.


Código:
class HDiarias(models.Model):
	fecha = models.DateField(auto_now_add=False)
	tec = models.IntegerField(null=True)
	pgeneral = models.IntegerField(null=True)
	
	def sumar(self):
		if self.pgeneral != None: (Solo chekeo q los campos no sean null)
			f = int(str(self.pgeneral))
		else:
			f = 0

		if self.tec != None:
			t = int(str(self.tec))
		else:
			t= 0

		suma = f + t
		return suma
En views.py declaro un objeto como la clase(puesto que no puedo llamar al metodo sumar sobre nada) y luego mando la variable al html.

Código:
from hsemanales.models import HDiarias
dia = HDiarias()
def main(request):
	ultimos_dias = HDiarias.objects.all().order_by('fecha')
	suma = dia.sumar()
	t = loader.get_template('main.html')
	c = Context({'ultimos_dias': ultimos_dias,'suma':suma})
	return HttpResponse(t.render(c))

El tema es que dia.sumar() siempre me da 0, es decir, que los campos son nulos. Estoy seguro que en la base de datos los campos no son nulos, pero tengo la sospecha que no me estoy comunicando bien con la base de datos.

Muchas gracias por tu ayuda.
Cualquier sugerencia es bienvenida!
  #4 (permalink)  
Antiguo 06/11/2013, 12:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Como trabajar con los objetos de models.py en django

Tengo una pregunta quieres la suma a través de varios registros o de un solo registro.

Código Python:
Ver original
  1. from hsemanales.models import HDiarias
  2. def main(request):
  3.     ultimos_dias = HDiarias.objects.all().order_by('fecha')
  4.     t = loader.get_template('main.html')
  5.     c = Context({'ultimos_dias': ultimos_dias})
  6.     return HttpResponse(t.render(c))

Código:
{% for prueba in ultimos_dias %}
    {{ prueba.suma }}
{% endfor %}
  #5 (permalink)  
Antiguo 06/11/2013, 15:50
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
Respuesta: Como trabajar con los objetos de models.py en django

Te comprendo. La suma quisiera hacerla de los últimos registros(o sea la última fecha) de los campos int de la base de datos. Son unos campos que guardan un número diariamente, quisiera sumar los datos de la última fecha de los campos.

Gracias por tu ayuda
  #6 (permalink)  
Antiguo 08/11/2013, 15:42
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 6 meses
Puntos: 2
Respuesta: Como trabajar con los objetos de models.py en django

Ok, después de investigar entontré una forma. Estaba confundido con respecto a los modelos de models.py en django.

Trataba de declarar un objeto como instancia de una clase de modelos.py así:
día = Hdiarias()
y luego llamar al método sumar de la clase HDiarias: dia.sumar().

Pero en las clases de models.py no funcionan así. Hay que usar el Django ORM con "objects".

Entonces el código quedó asi en views.py

Código:
def main(request):
	
	ultimos_dias = HDiarias.objects.all().order_by('fecha')
	valores_ultima_id = HDiarias.objects.values('tec','spd_coursera','pgeneral', \
		'codeacademy','realpython').order_by('-id')[0]
	suma = 0
	for values in valores_ultima_id.itervalues():
		suma += values
	
	t = loader.get_template('main.html')
	c = Context({'ultimos_dias': ultimos_dias,'suma':suma})
	return HttpResponse(t.render(c))
Si se les ocurre una mejor manera de sumar los valores de la última entrada, les agradezco cualquier sugerencia.

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 16:20.