如何让Django-Piston在序列化输出中包含相关的子对象?

时间:2010-02-21 12:43:12

标签: django foreign-keys django-piston

我把头发拉到这里是因为这对我不起作用,看起来应该是这样。

我正在使用Django-Piston开发API并拥有2个模型,即建筑和建筑区域。

BuildingArea有一个ForeignKey to Building,因为建筑物中有多个区域。 FK的'related_name'属性是'areas',因此我可以从给定的Building中访问BuildingAreas。

问题是它在Admin中看起来都很好但是当我点击/api/building.json端点时,我得到的是Building对象,而没有JSON中包含的嵌套的BuildingArea对象。

我原以为Django-Piston默认会关注反向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 个答案:

答案 0 :(得分:19)

好的,所以我通过emitters.py调试后最终得到了它,并注意到它如何使用处理程序的'fields'属性来迭代Model字段。

这些是我的模特:

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

答案 1 :(得分:0)

在BuildingHandler上,执行:

fields = ('address', 'areas')

应该这样做。

相关问题