2012-04-14 40 views
8

Así que he conectado Django a una base de datos preexistente con éxito (inspeccionar, validar y sincronizar) y he creado una aplicación y un proyecto y todo eso (estoy leyendo el libro de Django y yo estoy en el capítulo 5), pero cuando realmente lo ejecuto e imprimo cosas, me sale un error (supuesto). Mientras que en Python, adecuadamente importar lo que necesito (from myapp.models import Artist), pero si se intenta imprimir, por ejemplo, las cinco primeras filas de la tabla (print Artist.objects.all()[:5]), me sale esto:Imprimir Objetos en Django

[<Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>] 

¿Por qué no en realidad, imprime los valores en lugar de lo que parece ser un marcador de posición? ¿Hay algo que me falta aquí?

Respuesta

11

Django usa un ORM (Object Relational Mapper) que traduce los datos entre los objetos de Python y las filas de la base de datos. Entonces, cuando lo usa para obtener un elemento de la base de datos, lo convierte en un objeto de Python.

Si ese objeto no define cómo mostrarse como texto, Django lo hace por usted. Python hace lo mismo:

>>> class MyObject(object): 
...  pass 
... 
>>> [MyObject(), MyObject()] 
[<__main__.MyObject object at 0x0480E650>, 
<__main__.MyObject object at 0x0480E350>] 

Si quieres ver todos los valores reales de la fila para cada objeto, utilice values.

Aquí está el ejemplo de los documentos:

# This list contains a Blog object. 
>>> Blog.objects.filter(name__startswith='Beatles') 
[<Blog: Beatles Blog>] 

# This list contains a dictionary. 
>>> Blog.objects.filter(name__startswith='Beatles').values() 
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}] 
+0

Después de ver esta respuesta, me preguntaba si este era el dirección de su pregunta en lugar de mi respuesta. – jdi

+0

@jdi Tu respuesta me inspiró para agregar una explicación de por qué está viendo lo que está viendo, así como también cómo obtener los datos reales de la fila :) – agf

+0

¡Bien, ahora tienes todo el kit-kaboodle! – jdi

5

ACTUALIZACIÓN: En Python 3.x, utilice __str__ en lugar de __unicode__

Lo que está viendo es una lista de artista instancias modelo Tus valores están en un objeto python. Si desea hacer la representación de esos casos más útil, debe definir el método __unicode__ para ellos para imprimir algo útil:

https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#unicode

No es un marcador de posición, su representación del objeto real, convierte a Unicode .

+0

Ahh, allí vamos. Acabo de definir el Unicode para Artist y lo intenté de nuevo, y funciona; ¡Gracias! : D –

+0

@GabeC .: Oh, dulce, en realidad estaba en el camino correcto. Estaba pensando que agf podría haber estado tratando lo que realmente querías. – jdi

0

si desea utilizar el método de impresión ovveride la método Unicode en el propio modelo

def __unicode__(self): 
    return u'%s' % (self.id) 

aquí un modelo de ejemplo

class unit(models.Model): 
id = models.AutoField(primary_key=True) 
name = models.CharField(max_length=255) 
def __unicode__(self): 
    return u'%s' % (self.name) 

print(unit.objects.all()) 
[unit: KG, unit: PCs] 
+0

Podría ayudarme a comprender cómo puedo eliminar el nombre del modelo 'unit' de' [unit: KG, unit: PCs] ' para una instancia, en un bucle for que quiero imprimir como a continuación:' A from KG' 'B de PC' aquí' A, B' será de otro modelo y 'KG, PC' son del modelo' unidad'. –

+0

Esa es una pregunta aparte, no es un comentario y necesitamos ver más de su código. –

Cuestiones relacionadas