9

나는 장고와 함께 몇 가지 문제를 직렬화하고있다. 3 가지 모델이 있습니다. 예를 들어, 학교, 방 및 책상 (예 : 가명)을 예로 들어 봅시다. 각 학교에는 여러 개의 방이 있고 각 방에는 여러 개의 책상이 있습니다.Django.rest_framework : one to many to many to serialize하는 방법은?

클래스와의 관계는 다음과 같다 :

class School(models.Model): 
    name = models.CharField() 

class Room(models.Model): 
    name = models.CharField() 
    school_id = models.ForeignKey(School) 

class Desk(models.Model): 
    row = models.IntegerField() 
    col = models.IntegerField() 
    room_id = models.ForeignKey(Room) 

내가 내 각 직접 포함하는 모든 책상을 학교의 목록을 직렬화 할 수 있어야합니다. 책상의 목록을 포함하는 공간의 목록이 포함 된 학교의 목록을 반환

class DeskSerializer(serializers.ModelSerializer): 
    class Meta: 
     field = (row, col,) 

class RoomSerializer(serializers.ModelSerializer): 

    desks = DeskSerializer(source='desk_set', many=True) 
    class Meta: 
     field = (desks,) 

class SchoolSerializer(serializers.ModelSerializer): 

    rooms = RoomSerializer(source='room_set', many=True) 
    class Meta: 
     field = (name, rooms,) 

나는 학교의 목록을 원하는 :

는 내가 가진 옷장 내 serialize.py 세 시리얼 라이저를 작성하여이었다 책상 목록이 포함되어 있습니다

학교 직렬기에서 책상을 직접 가져 오기 위해 사용해야하는 소스는 무엇입니까? source = 'room_set.desk_set'과 같은 것입니까? 아니면 transform_ 함수를 사용하여?

PS : 내가 제대로 이해 해요 경우 코드는 게시물에 처음부터 쓰기이며, 가능한 구문 오류

답변

16

을 무시하세요, 당신은 SchoolSerializer 2 개 수준 깊은 중첩 된 구조를 반환하고자하지만, 건너 뛰는 중간 모델. 이를 위해, 나는 Desk 인스턴스를 검색하기 위해 School 모델의 방법을 만들 것입니다 :

class School(models.Model): 
    ... 

    def get_desks(self): 
     rooms = Room.objects.filter(school=self) 
     desks = Desk.objects.filter(room__in=rooms) 
     return desks 

을 그리고, SchoolSerializer 메소드 것을 사용하고 당신이 당신의 DeskSerializer를 통해 원하는대로 반환 된 인스턴스를 렌더링하는 필드를 포함하여 지역 :

class SchoolSerializer(serializers.ModelSerializer): 
    ... 
    desks = DeskSerializer(
     source='get_desks', 
     read_only=True 
    ) 

    class Meta: 
     field = (name, desks) 

이 어떻게 작동하는지 이해하는 열쇠는 source 인수에 대한 값으로 사용되는 모델 방법은 단순히 시리얼의 모델의 인스턴스를 반환해야한다는 것입니다. serializer는 거기에서 가져 와서 serializer 내에서 정의한 객체 (이 경우 DeskSerializer)를 렌더링합니다.

희망이 도움이됩니다.

+2

다음 쿼리를 사용하여 쿼리를 수행 할 수 있습니다. desks = Desk.objects.filter (room__school = self) –