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_set
URL로 이동하면 확장 응답이 반환됩니다.언젠가 이것이 누군가에게 도움이 되길 바랍니다.건배!
@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
'programing' 카테고리의 다른 글
Oracle에서 임시 테이블로 선택 (0) | 2023.06.25 |
---|---|
스프링 업로드 파일 크기 제한 오류 (0) | 2023.06.25 |
Python: 데이터 프레임에서 시간 델타를 int로 변환 (0) | 2023.06.25 |
Spring Boot Resource Server에서 보안 예외 처리 (0) | 2023.06.25 |
클라이언트의 NLS_LANG를 확인하려면 어떻게 해야 합니까? (0) | 2023.06.25 |