Foros del Web » Programando para Internet » Python »

Crear modelos que dependen de otros

Estas en el tema de Crear modelos que dependen de otros en el foro de Python en Foros del Web. Estoy intentando hacer una pequeña aplicacion que pretende ser una tienda online. Para ello creo tres modelos Articulo, Imagen y Categoría. Cada Articulo puede pertenecer ...
  #1 (permalink)  
Antiguo 15/12/2011, 19:15
 
Fecha de Ingreso: diciembre-2011
Mensajes: 7
Antigüedad: 12 años, 4 meses
Puntos: 0
Pregunta Crear modelos que dependen de otros

Estoy intentando hacer una pequeña aplicacion que pretende ser una tienda online. Para ello creo tres modelos Articulo, Imagen y Categoría.

Cada Articulo puede pertenecer a varias categorías y tener varias imágenes.

Este es mi código:


Código Python:
Ver original
  1. def upload_path(instance, filename):
  2.     directorio = instance.Articulo.nombre.lower()
  3.     return directorio.join(filename)
  4.  
  5.  
  6. # Create your models here.
  7.  
  8. class Imagen(models.Model):
  9.     nombre = models.CharField(max_length=30,null=True,blank=True)
  10.     foto = models.ImageField(upload_to=upload_path,null=True,blank=True)
  11.        
  12. class Categoria(models.Model):
  13.     nombre = models.CharField(max_length=30)
  14.        
  15. class Articulo(models.Model):
  16.     nombre=models.CharField(max_length=30)
  17.     descripcion=models.CharField(max_length=700,blank=True)
  18.     precio=models.DecimalField(max_digits=100, decimal_places=2)
  19.     fotos=models.ForeignKey(Imagen,blank=True,null=True)
  20.     categorias=models.ManyToManyField(Categoria,blank=True)

He hecho un pequeño apaño, pues pretendo que me guarde las imágenes de cada artículo en una carpeta diferente. Con este código he podido crear la base de datos, pero cuando lo he probado desde el panel de admin, es imposible añadir un nuevo artículo o imagen. ¿He hecho algo mal?

Quiero probarlo desde un formulario con una plantilla, pero temo que seguramente no funcionara tampoco.

¿Alguna idea de como debería hacerlo?

Última edición por cagarnera; 15/12/2011 a las 19:30 Razón: Cambiar CODE por HIGHLIGHT=python
  #2 (permalink)  
Antiguo 15/12/2011, 20:31
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: Crear modelos que dependen de otros

¿Que error te marca?

Haz pruebas con un modelo simplificado.

Por ejemplo yo hice la siguiente prueba:
Código Python:
Ver original
  1. #models.py
  2. from django.db import models
  3.  
  4. class Imagen(models.Model):
  5.     nombre = models.CharField(max_length=30)
  6.     foto = models.ImageField(upload_to='imagenes/%Y/%m/%d')

Código Python:
Ver original
  1. #admin.py
  2. from django.contrib import admin
  3. from models import Imagen
  4.  
  5. admin.site.register(Imagen)

Me funciona perfectamente, excepto con el detalle que no sirve el contenido estático (solo es cuestión de configurarlo), pero sube perfectamente bien la imagen al servidor.
  #3 (permalink)  
Antiguo 16/12/2011, 03:55
 
Fecha de Ingreso: diciembre-2011
Mensajes: 7
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Crear modelos que dependen de otros

El código que me has puesto tu, claro que funciona. No depende de otras cosas. Pero no es lo que quiero hacer. Quiero que las imágenes se guarden en una carpeta llamada como el articulo.

Cuando intento crear un nuevo artículo (desde el panel de admin) sin añadir foto me suelta este error:
IntegrityError
eShop_articulo.fotos_id may not be NULL


Y si pruebo a crear primero una Imagen:
AttributeError
'Imagen' object has no attribute 'Articulo'


He copiado solo la parte que creo que era importante de los errores, si necesitaís más para entenderlos me lo decís y los copio enteros

El segundo es porque no puede acceder al Articulo para mirar su nombre (normal, aún no existe)

Y el primero supongo que será problema de como está creada la base de datos, me está pidiendo un valor "clave" (creo que se llama así) que debe existir, pero al no crear la foto no aparece.

Igual esto no se puede hacer así, no me acabo de fiar del apaño que hice y seguramente hay una manera mejor de hacerlo pero no se me ocurre (y no encuentro nada en la documentación)
  #4 (permalink)  
Antiguo 16/12/2011, 04:59
 
Fecha de Ingreso: diciembre-2011
Mensajes: 7
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Crear modelos que dependen de otros

Problema solucionado. Si a alguien le interesa. El problema estaba en como había definido los modelos (ya lo sabía, pero no entendía que hacía mal).

Como estaba definido, no se podía crear una imagen sin crear primero un artículo (esto es lo que pretendía) pero no podía crear un artículo pues para crearlo necesitaba crear una imagen (que no se podía porque aún no había creado el artículo) y así hasta el infinito (y más alla )

La solución es así:

Código Python:
Ver original
  1. from django.db import models
  2. import os
  3.  
  4.  
  5. #Funcion que crea una ruta dentro de la carpeta media
  6. #con el nombre del archivo
  7.  
  8. def upload_path(instance, filename):
  9.     directorio = instance.articulos.nombre.lower()
  10.     #if directorio:
  11.         #return null
  12.     return os.path.join(directorio)
  13.     #else:
  14.         #return null
  15.  
  16.  
  17.  
  18. # Create your models here.
  19. class Categoria(models.Model):
  20.     nombre = models.CharField(max_length=30)
  21.  
  22. class Articulo(models.Model):
  23.     nombre=models.CharField(max_length=30)
  24.     descripcion=models.CharField(max_length=700,blank=True)
  25.     precio=models.DecimalField(max_digits=100, decimal_places=2)
  26.     categorias=models.ManyToManyField(Categoria,blank=True)
  27.  
  28.  
  29. class Imagen(models.Model):
  30.     articulos = models.ForeignKey(Articulo)
  31.     nombre = models.CharField(max_length=30,null=True,blank=True)
  32.     foto = models.ImageField(upload_to=upload_path,null=True,blank=True)

ForeignKey debe de estar en Imagen y no en Artículo.

Es una tontería lo se, pero me ha dado más de un dolor de cabeza resolverlo

Última edición por cagarnera; 16/12/2011 a las 05:09

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 05:12.