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

Ash*_*mah 12 django foreign-keys django-piston

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

我正在使用Django-Piston开发API并拥有2个模型,Building和Building Area.

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()
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

Ash*_*mah 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 
Run Code Online (Sandbox Code Playgroud)

这就是我的BuildingHandler现在的样子:

class BuildingHandler(BaseHandler):

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

    def read(self, name=None):
        return self.model.objects.all()
Run Code Online (Sandbox Code Playgroud)

这里要注意的重要一点是,只有当前字段定义是集合或列表时,emmitters.py才会激活某些代码路径.我忘了在用于定义字段的集合中添加一个尾随',',这导致Piston导致Python返回由字符串'display_name'中包含的字符组成的集合,而不是包含字符串的集合'显示名称'.我希望这是有道理的,谷歌'Python单集尾随逗号'获取更多信息.

希望这有助于其他人!:d