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
| 归档时间: |
|
| 查看次数: |
3071 次 |
| 最近记录: |