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

однако это будет включать только отношения для прямых отношений, что в данном случае не совсем то, что вам нужно, так как поле учителей-это обратные отношения.

если у вас более сложные требования (например. включите обратные отношения, вложите некоторые поля, но не другие, или вложите только определенное подмножество полей) вы можете nest сериализаторы, например...

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 в поле сериализатора, чтобы указать атрибут для использования в качестве источника поля. Мы могли бы 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",)