12

我在这里拉头发,因为这对我不起作用,而且似乎应该如此。

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

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

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

我原以为 Django-Piston 默认会遵循反向 FK 字段,还是我遗漏了什么?

处理程序.py

class BuildingHandler(BaseHandler):

    allowed_methods = ('GET',)    
    model = Building

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

模型.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 
4

2 回答 2

19

好的,所以在通过emitters.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 

这就是我的 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 single set trailing comma' 以获取更多信息。

希望这对其他人有帮助!:D

于 2010-02-25T06:26:18.110 回答
0

在 BuildingHandler 上,执行:

fields = ('address', 'areas')

那应该这样做。

于 2010-02-21T12:59:30.753 回答