Как включить связанные поля модели с помощью 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
},
]
},


это возможно? Если да, то как? И это плохая идея?

631   2  

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

    Ничего не найдено.