type practices on_delete intfield db_column best python django

python - practices - on_delete django options



Usando related_name correctamente en Django (3)

Tengo dos modelos que están relacionados entre sí utilizando ForeignKey y se utiliza related_name. Aquí hay un ejemplo.

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 intenté.

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

nada se imprime

Pero cuando intento john.classes

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

¿Estoy haciendo algo mal? ¿Cómo accedo al nombre de la clase usando related_name? Necesita alguna orientación.


Puedes hacer esto 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

Te dará el nombre de la clase en la primera fila.


Sí, las clases son un manager. Pueden ser varias clases para un profesor. Así que para dar salida a sus nombres debes hacer:

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

Si solo desea una clase para un estudiante, use la relación uno a uno. En este caso puede acceder al campo relacionado con su método.


Solo ten en cuenta que estás definiendo una relación de muchos. Por lo tanto, el estudiante puede tener varias clases, por lo tanto, john.classes.name no puede funcionar, ya que no ha especificado la clase de la cual desea tener el nombre. en john.classes "clases" es solo un administrador que puede usar como cualquier otro Administrador de modelos de Django. Puede hacer un john.classes.all () (como sergzach propsed), pero también cosas como john.classes.get (...) o john.classes.filter (...).