2012-04-14 16 views
8

Così ho collegato Django a un database preesistente con successo (ispezioni, convalida e sincronizzazione) e ho creato un'app e un progetto e tutto il resto (sto leggendo il libro di Django e io nel capitolo 5), ma quando eseguo effettivamente e stampo roba, ottengo un errore (presunto). Mentre in python, ho correttamente importare quello che mi serve (from myapp.models import Artist), ma se provo a stampare, per esempio, le prime cinque righe della tabella (print Artist.objects.all()[:5]), ottengo questo:Stampa di oggetti in Django

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

Perché non è vero effettivamente stampare i valori anziché quello che sembra essere un segnaposto? C'è qualcosa che mi manca qui?

risposta

11

Django utilizza un ORM (Object-Relational Mapper) che traduce i dati avanti e indietro tra gli oggetti Python e le righe del database. Quindi quando lo usi per ottenere un oggetto dal database, lo converte in un oggetto Python.

Se quell'oggetto non definisce come visualizzare se stesso come testo, Django lo fa per te. Python fa la stessa cosa:

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

Se volete vedere tutti i valori effettivi per la riga per ogni oggetto, utilizzare values.

Ecco l'esempio dalla documentazione:

# 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

Dopo aver visto questa risposta, mi sono chiesto se questo era il direzione della sua domanda in contrasto con la mia risposta. – jdi

+0

@jdi La tua risposta mi ha ispirato ad aggiungere una spiegazione del perché sta vedendo ciò che sta vedendo, oltre a come ottenere i dati effettivi delle righe :) – agf

+0

Bene, ora hai tutto il keboodle del gattino! – jdi

5

UPDATE: In Python 3.x, utilizzare __str__ invece di __unicode__

Quello che state vedendo è una lista di Artist istanze di modello. I tuoi valori sono in un oggetto python. Se volete rendere la rappresentazione di quei casi più utile, è necessario definire il metodo __unicode__ per loro di stampare qualcosa di utile:

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

suo non è un segnaposto, la sua rappresentazione dell'oggetto reale, convertito in unicode .

+0

Ah, eccoci. Ho appena definito l'unicode per Artist e l'ho provato di nuovo, e funziona; Grazie! : D –

+0

@GabeC .: Oh dolce, ero davvero sulla buona strada. Stavo pensando che Agf avrebbe potuto affrontare quello che volevi davvero. – jdi

0

se si desidera utilizzare il metodo di stampa ovveride il metodo unicode nel modello stesso

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

qui un modello di esempio

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

Potrebbe aiutarmi a capire come posso rimuovere il nome del modello 'unit' da' [unità: KG, unità: PC] ' per un'istanza, in un ciclo for che voglio stampare come di seguito:' A da KG' 'B dai PC' qui' A, B' sarà da un altro modello e 'KG, PC' sono dal modello' unità'. –

+0

Questa è una domanda separata, non un commento e abbiamo bisogno di vedere più del tuo codice. –