【问题标题】:How do I make Django-Piston to include related child objects in the serialized output?如何使 Django-Piston 在序列化输出中包含相关的子对象?
【发布时间】:2026-01-07 07:20:10
【问题描述】:

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

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

BuildingArea 有一个建筑外键,因为建筑中有多个区域。 FK 的“related_name”属性是“areas”,因此我可以从给定的建筑物访问 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 

【问题讨论】:

    标签: django foreign-keys django-piston


    【解决方案1】:

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

    【讨论】:

    • 一万票给你先生(或女士)。或者至少一个。不知怎的,我一定错过了。活塞继续给我惊喜。
    • 尽管我认为这个答案很疯狂,但这是正确的答案。 +1 并在我忘记时添加书签。
    • 现在节省了我很多时间。
    • “set”我相信你的意思是“tuple”。
    【解决方案2】:

    在 BuildingHandler 上,执行:

    fields = ('address', 'areas')
    

    应该可以的。

    【讨论】:

    • 好吧,我一定是塞了点东西,因为我以为我已经尝试过了。我会尝试并报告。
    • 好吧,我试过了,但还是不行 - 输出是: [ { "areas": "", "address": "42 Frigate Crescent" } ] 但是里面肯定有一个 BuildingArea db 及其关系正确设置为指向 Building。
    最近更新 更多