Как включить связанные поля модели с помощью Django Rest Framework?
предположим, что у нас есть следующая модель:
class Classroom(models.Model):
room_number = [....]
class Teacher(models.Model):
name = [...]
tenure = [...]
classroom = models.ForeignKey(Classroom)
предположим, что вместо получения такого результата в функции ManyRelatedPrimaryKeyField:
{
"room_number": "42",
"teachers": [
27,
24,
7
]
},
вернуть что-то, что включает в себя полное представление модели как:
{
"room_number": "42",
"teachers": [
{
'id':'27,
'name':'John',
'tenure':True
},
{
'id':'24,
'name':'Sally',
'tenure':False
},
]
},
это возможно? Если да, то как? И это плохая идея?
2 ответов:
самый простой способ-это использовать глубину аргумент
class ClassroomSerializer(serializers.ModelSerializer): class Meta: model = Classroom depth = 1однако это будет включать только отношения для прямых отношений, что в данном случае не совсем то, что вам нужно, так как поле учителя является обратным отношением.
если у вас более сложные требования (например. включите обратные отношения, вложите некоторые поля, но не другие, или вложите только определенное подмножество полей) вы можете сериализаторы гнездо, например...
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обратите внимание, что мы используем аргумент source в поле serializer, чтобы указать атрибут, который будет использоваться в качестве источника поля. Мы могли бы
sourceаргумент вместо того, чтобы убедиться, чтоteachersатрибут существует с помощью related_name наTeacherмодель, т. е..classroom = models.ForeignKey(Classroom, related_name='teachers')следует иметь в виду, что вложенные сериализаторы в настоящее время не поддерживают операции записи. Для записываемых представлений следует использовать обычные плоские представления, такие как pk или гиперссылки.
спасибо @TomChristie!!! Вы мне очень помогли! Я хотел бы немного обновить это (из-за ошибки, с которой я столкнулся)
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",)
Comments