Как сделать так, чтобы Django-Piston включал связанные дочерние объекты в сериализованный вывод? - PullRequest
12 голосов
/ 21 февраля 2010

Я тяну свои волосы сюда, потому что это не работает для меня и кажется, что это должно быть.

Я использую Django-Piston для разработки API и имею 2 модели, Building and Building Area.

BuildingArea имеет ForeignKey to Building, поскольку в здании есть несколько областей. Свойство related_name для FK - это «области», поэтому я могу получить доступ к BuildingAreas из данного здания.

Проблема в том, что в Admin все выглядит нормально, но когда я нажимаю на конечную точку /api/building.json, все, что я получаю, это объект Building без вложенных объектов BuildingArea, включенных в JSON.

Я бы подумал, что Джанго-Пистон будет следовать по умолчанию обратным полям FK или я что-то упустил?

handlers.py

class BuildingHandler(BaseHandler):

    allowed_methods = ('GET',)    
    model = Building

    def read(self, name=None):
        return self.model.objects.all()

models.py

class Building(models.Model):
    address         = models.CharField(max_length=255)

    def __unicode__(self):
        return self.address 

class BuildingArea(models.Model):
    display_name  = models.CharField(max_length=30)
    building      = models.ForeignKey(Building, related_name='areas') 

    def __unicode__(self):
        return self.display_name 

Ответы [ 2 ]

19 голосов
/ 25 февраля 2010

Хорошо, так что я наконец-то заработал после отладки через emitters.py и заметил, как он использует свойство 'fields' обработчика для итерации полей модели.

Это мои модели:

class Building(models.Model):
    address         = models.CharField(max_length=255)

    def __unicode__(self):
        return self.address 

class BuildingArea(models.Model):
    display_name  = models.CharField(max_length=30)
    building      = models.ForeignKey(Building, related_name='areas') 

    def __unicode__(self):
        return self.display_name 

Вот так выглядит мой BuildingHandler:

class BuildingHandler(BaseHandler):

    allowed_methods = ('GET',)    
    fields = ('address', ('areas', ('display_name',),),)    
    model = Building

    def read(self, name=None):
        return self.model.objects.all()

Здесь важно отметить, что emmitters.py будет активировать определенные пути кода только в том случае, если текущим определением поля является набор или список. Я забыл добавить завершающий «,» к наборам, используемым для определения полей, и это заставило Piston заставить Python возвращать набор, состоящий из символов, содержащихся в строке «display_name», а не набор, содержащий строку « отображаемое имя'. Я надеюсь, что это имело смысл, Google 'Python одиночная конечная запятая' для получения дополнительной информации.

Надеюсь, это поможет кому-то еще! : D

0 голосов
/ 21 февраля 2010

На BuildingHandler, сделайте:

fields = ('address', 'areas')

Это должно сделать это.

...