programing

Django Rest Framework를 사용하여 관련 모델 필드를 포함하려면 어떻게 해야 합니까?

magicmemo 2023. 6. 25. 18:38
반응형

Django Rest Framework를 사용하여 관련 모델 필드를 포함하려면 어떻게 해야 합니까?

다음과 같은 모델이 있다고 가정합니다.

class Classroom(models.Model):
    room_number = [...]

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

이러한 결과를 MultiRelatedPrimaryKeyField 함수별로 얻는 대신 다음과 같이 가정해 보겠습니다.

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

다음과 같은 전체 관련 모델 표현이 포함된 것을 반환하도록 합니다.

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

이것이 가능합니까?만약 그렇다면, 어떻게?그리고 이것은 나쁜 생각입니까?

가장 간단한 방법은 깊이 인수를 사용하는 것입니다.

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

serializer 필드에서 source 인수를 사용하여 필드의 소스로 사용할 속성을 지정합니다.우리는 그것을 떨어뜨릴 수 있습니다.source대신에 확실하게 함으로써 논쟁.teachers속성은 에서 related_name 옵션을 사용하여 존재합니다.Teacher모델, 즉. classroom = models.ForeignKey(Classroom, related_name='teachers')

한 가지 주의할 점은 중첩된 직렬화 프로그램이 현재 쓰기 작업을 지원하지 않는다는 것입니다.쓰기 가능한 표현의 경우 pk 또는 하이퍼링크와 같은 일반적인 플랫 표현을 사용해야 합니다.

감사합니다. @Tom Christie!!!당신은 나를 많이 도와줬어요!(제가 우연히 만난 실수 때문에) 그것을 조금 업데이트하고 싶습니다.

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",)

이것은 또한 drf-flex-fields라고 불리는 매우 편리한 댄디 장고 패키지를 사용하여 달성될 수 있습니다.우리는 그것을 사용합니다. 그리고 그것은 꽤 멋집니다.설치만 하면 됩니다.pip install drf-flex-fields시리얼라이저를 통해 전달하고, 추가합니다.expandable_fields빙고(아래 그림).또한 점 표기법을 사용하여 심층 중첩 관계를 지정할 수 있습니다.

from rest_flex_fields import FlexFieldsModelSerializer

class ClassroomSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = Model
        fields = ("teacher_set",)
        expandable_fields = {"teacher_set": (TeacherSerializer, {"source": "teacher_set"})}

그런 다음 추가합니다.?expand=teacher_setURL로 이동하면 확장 응답이 반환됩니다.언젠가 이것이 누군가에게 도움이 되길 바랍니다.건배!

@Tom Christie와 @Paolo 덕분입니다.

아래 코드는 정상적으로 작동하지만 관련_name="teacher_set" 속성을 모델 교사에 추가하는 것을 기억해야 합니다.이 경우 전체 코드는 다음과 같습니다.

models.py

class Classroom(models.Model):
    room_number = [...]

class Teacher(models.Model):
    name = [...]
    tenure = [...]
    classroom = models.ForeignKey(Classroom, related_name='teacher_set')

참고: 강의실 필드에 관련_name='선생님_set'.

serializers.py

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",)

언급URL : https://stackoverflow.com/questions/14573102/how-do-i-include-related-model-fields-using-django-rest-framework

반응형