我把头发拉到这里是因为这对我不起作用,看起来应该是这样。
我正在使用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
答案 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')
应该这样做。