2012-08-23 16 views
20

Ho due modelli correlati tra loro utilizzando ForeignKey e related_name è usato. Ecco un esempio.Uso related_name correttamente in Django

class Student(models.Model): 
    name = models.CharField(max_length=255) 
    birthday = models.DateField(blank=True) 


class Class(models.Model): 

    name = models.CharField(max_length=255) 
    student = models.ForeignKey(Student, 
           related_name='classes', 
           null=True) 

    def __unicode__(self): 
     return self.name 

Ad esempio, vorrei accedere al nome della classe.

Questo è quello che ho provato.

john = Student.objects.get(username = 'john') 
print john.classes.name 

non viene stampato nulla.

Ma quando provo john.classes

ottengo oggetto django.db.models.fields.related.RelatedManager a 0x109911410. Questo dimostra che sono imparentati. Ma mi piacerebbe avere il nome della classe.

Sto facendo qualcosa di sbagliato? Come posso accedere al nome della classe usando related_name? Hai bisogno di una guida.

risposta

18

Sì, le classi sono un gestore. Può essere più classi per un insegnante. Quindi, per l'uscita i loro nomi si dovrebbe fare:

john = Student.objects.get(username = 'john') 
for class2 in john.classes.all(): 
    print class2.name 

Se si desidera una sola classe per uno studente quindi utilizzare uno-a-uno relazione. In questo caso puoi accedere al campo correlato con il tuo metodo.

+0

c'è una sola classe per ogni bambino. allora perché non john.classes.name? – lakesh

+0

la tua soluzione funziona ma ti piacerebbe sapere perché john.classes.name non funziona? – lakesh

+0

Perché ForeignKey rende diverse classi per un figlio, non una classe. Se vuoi solo una classe usa il campo onetoone. – sergzach

3

Basta essere consapevoli: si sta definendo una relazione 1-molti. Quindi, lo studente potrebbe avere più classi, quindi john.classes.name non può funzionare, dal momento che non hai specificato la classe di cui vuoi avere il nome. in john.classes "classes" è solo un gestore che puoi usare come qualsiasi altro Django Model Manager. Puoi fare un john.classes.all() (come sergzach propsed), ma anche cose come john.classes.get (...) o john.classes.filter (...).

1

si può fare in questo modo per accedere alla prima riga della tabella

john = Student.objects.get(username = 'john')  
john.classes.all().first().name # to access first row 
john.classes.all().last().name # to access last row 

nell'esempio di cui sopra non si vuole per scorrere gli oggetti

che vi darà il nome del classe nella prima riga

Problemi correlati