9

Django ile serileştirme konusunda bazı sıkıntılarım var. Üç modelim var, bir okul, bir oda ve bir masa diyelim (örneğin kukla ismi) diyelim. Her okulda birden fazla oda var ve her odada birden fazla masa var.Django.rest_framework: Bire birçok kişiye nasıl serileştirilir?

sınıflar ve onların ilişkileri şuna benzer:

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) 

içimde, her direkt içeren tüm masaları Okulu listesini getirilmeye isterler. masanın bir listesini içeren odanın bir listesini içeren okul listesini döndürür

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

ben Okulu listesini istiyorum:

aldığım dolap benim serialize.py üç seri hale yazarak oldu Masanın bir listesini içeren tabloyu içeren bir tabloyu içeren tabloyu içeren bir tabloyu içeren tabloyu bulmak için School serializer'da hangi kaynağı kullanmalıyım? Source = 'room_set.desk_set' gibi bir şey var mı? Ya da belki bir transform_ işlevi kullanarak?

Not: seni doğru anlama olsam kod yayında sıfırdan yazma olduğunu, olası sözdizimi hatalarını

cevap

16

göz ardı edin, size SchoolSerializer 2 seviyeleri derin iç içe geçmiş bir yapı dönmek istiyorum, ama atlama ara model. Bunu yapmak için, ben Desk örneklerini almak için School modelinde bir yöntem yaratacak:

class School(models.Model): 
    ... 

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

Sonra SchoolSerializer yönteme kullanan ve size DeskSerializer aracılığıyla istedikleri gibi dönen örneklerini vermektedir bir alan bulu içinde:

Bunun nasıl çalıştığını anlamanın anahtarı source bağımsız değişken değeri kullanılan model yöntemi sadece o serileştirici modeline sonucu örneklerine gerektiğidir. Serializer onu oradan alır, nesneler (ler) i, ancak bunları serializer içinde tanımladığınız halde (bu durumda DeskSerializer).

Bu yardımcı olur umarım.

+2

Bunu bir sorguda yapabilirsiniz: desks = Desk.objects.filter (room__school = self) –

İlgili konular