2012-08-23 12 views
20

Tengo dos modelos que se relacionan entre sí usando ForeignKey y related_name se usa. Aquí hay un ejemplo.Usando related_name correctamente en 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 

Por ejemplo, me gustaría acceder al nombre de la clase.

Esto es lo que probé.

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

nada se imprime.

Pero cuando intento john.classes

me sale objeto django.db.models.fields.related.RelatedManager en 0x109911410. Esto muestra que están relacionados. Pero me gustaría obtener el nombre de clase.

¿Estoy haciendo algo mal? ¿Cómo accedo al nombre de la clase usando related_name? Necesito alguna guía

Respuesta

18

Sí, las clases es un administrador. Pueden ser varias clases para un maestro. Así que para la producción de sus nombres que debe hacer:

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

Si desea sólo una clase para un estudiante continuación, utilice uno-a-uno respecto. En este caso, puede acceder al campo relacionado con su método.

+0

hay solo una clase para cada niño. entonces ¿por qué no john.classes.name? – lakesh

+0

su solución funciona, pero desea saber por qué john.classes.name no está funcionando? – lakesh

+0

Porque ForeignKey hace varias clases para un niño, no una clase. Si solo quieres una clase, usa el campo onetoone. – sergzach

3

Solo ten en cuenta: estás definiendo una relación 1-many. Por lo tanto, el alumno podría tener múltiples clases, por lo tanto, john.classes.name no puede funcionar, ya que no ha especificado la clase de la que desea que tenga el nombre. en john.classes "classes" es solo un administrador que puedes usar como cualquier otro Django Model Manager. Puede hacer un john.classes.all() (como sergzach propsed), pero también cosas como john.classes.get (...) o john.classes.filter (...).

1

que puede hacer como este para acceder a la primera fila de la tabla

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

en el ejemplo anterior no desea iterar sobre los objetos

que le dará el nombre de la clase en la primera fila

Cuestiones relacionadas