12

これは私にはうまくいかず、そうあるべきだと思われるので、ここで髪を引っ張っています。

私は Django-Piston を使用して API を開発しており、Building と Building Area の 2 つのモデルがあります。

建物には複数のエリアがあるため、BuildingArea には Building への ForeignKey があります。FK の「related_name」プロパティは「areas」であるため、特定の建物から BuildingAreas にアクセスできます。

問題は、Admin ではすべて問題ないように見えますが、/api/building.json エンドポイントに到達すると、JSON にネストされた BuildingArea オブジェクトが含まれていない Building オブジェクトしか取得できません。

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 
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 は、文字列 '表示名'。詳細については、Google の「Python シングル セット トレーリング コンマ」を参照してください。

うまくいけば、これは他の誰かに役立ちます!:D

于 2010-02-25T06:26:18.110 に答える
0

BuildingHandler で、次のようにします。

fields = ('address', 'areas')

それはそれを行う必要があります。

于 2010-02-21T12:59:30.753 に答える