9

Tôi có một số khó khăn khi serializing với django. Tôi có ba mô hình, giả sử Trường học, Phòng và Bàn làm việc (ví dụ như tên giả). Mỗi trường có nhiều phòng và mỗi phòng có nhiều bàn.Django.rest_framework: Làm thế nào để serialize một đến nhiều cho nhiều?

Các lớp và các mối quan hệ của họ giống như thế này:

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) 

Tôi muốn để có thể serialize một danh sách các trường, mỗi chứa trực tiếp tất cả các bàn bên trong.

Các tủ quần áo tôi nhận được bằng cách viết trong serialize.py tôi ba serializer:

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

nào trả về một danh sách các trường có chứa một danh sách các phòng chứa danh sách các bàn làm việc, khi tôi muốn có một danh sách các trường có chứa danh sách bàn

Tôi nên sử dụng nguồn nào trong bộ nối tiếp của trường để quay lại trực tiếp bàn làm việc? Cái gì đó như source = 'room_set.desk_set'? Hoặc có thể bằng cách sử dụng hàm transform_?

PS: mã là viết từ đầu vào bưu điện, xin vui lòng bỏ qua những lỗi cú pháp có thể

Trả lời

16

Nếu tôi hiểu bạn một cách chính xác, bạn muốn SchoolSerializer để trả về một cấu trúc lồng nhau 2 cấp độ sâu, nhưng bỏ qua mô hình trung gian. Để làm điều này, tôi sẽ tạo ra một phương pháp trong mô hình School của bạn để lấy Desk trường hợp:

class School(models.Model): 
    ... 

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

Sau đó, trong SchoolSerializer của bạn bao gồm một lĩnh vực có sử dụng phương pháp và làm cho các trường hợp quay trở lại như bạn muốn qua DeskSerializer của bạn:

Chìa khóa để tìm hiểu cách thức hoạt động này là các phương pháp mô hình sử dụng làm giá trị cho đối số source chỉ đơn giản là phải trở về trường hợp của mô hình của serializer đó. Trình serializer lấy nó từ đó, render (các) đối tượng tuy nhiên bạn đã định nghĩa chúng trong serializer đó (trong trường hợp này là DeskSerializer).

Hy vọng điều này sẽ hữu ích.

+2

Bạn có thể làm điều đó trong một truy vấn với: desk = Desk.objects.filter (room__school = self) –

Các vấn đề liên quan