¿Cómo incluyo campos de modelos relacionados con Django Rest Framework?

Digamos que tenemos el siguiente modelo:

class Classroom(models.Model): room_number = [....] class Teacher(models.Model): name = [...] tenure = [...] classroom = models.ForeignKey(Classroom) 

Digamos que en lugar de obtener un resultado como este por la función ManyRelatedPrimaryKeyField:

 { "room_number": "42", "teachers": [ 27, 24, 7 ] }, 

haga que devuelva algo que incluya la representación del modelo relacionado completo como:

 { "room_number": "42", "teachers": [ { 'id':'27, 'name':'John', 'tenure':True }, { 'id':'24, 'name':'Sally', 'tenure':False }, ] }, 

es posible? ¿Si es así, cómo? ¿Y es una mala idea?

La forma más sencilla es usar el argumento de profundidad.

 class ClassroomSerializer(serializers.ModelSerializer): class Meta: model = Classroom depth = 1 

Sin embargo, eso solo incluirá las relaciones para las relaciones hacia adelante, que en este caso no es lo que necesita, ya que el campo de profesores es una relación inversa.

Si tiene requisitos más complejos (por ejemplo, incluir relaciones inversas, anidar algunos campos, pero no otros, o anidar solo un subconjunto específico de campos) puede anidar serializadores , por ejemplo …

 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = Teacher fields = ('id', 'name', 'tenure') class ClassroomSerializer(serializers.ModelSerializer): teachers = TeacherSerializer(source='teacher_set') class Meta: model = Classroom 

Tenga en cuenta que utilizamos el argumento fuente en el campo del serializador para especificar el atributo que se usará como fuente del campo. Podríamos descartar el argumento source asegurándonos de que el atributo de los teachers exista utilizando la opción related_name en su modelo de Teacher , es decir. classroom = models.ForeignKey(Classroom, related_name='teachers')

Una cosa a tener en cuenta es que los serializadores nesteds no admiten actualmente las operaciones de escritura. Para representaciones de escritura, debe usar representaciones planas regulares, como pk o hipervinculación.

Gracias @TomChristie !!! ¡Me ayudaste mucho! Me gustaría actualizar eso un poco (debido a un error que encontré)

 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = Teacher fields = ('id', 'name', 'tenure') class ClassroomSerializer(serializers.ModelSerializer): teachers = TeacherSerializer(source='teacher_set', many=True) class Meta: model = Classroom field = ("teachers",)