2010-02-21 4 views
12

Ich ziehe mir die Haare aus, weil das bei mir nicht funktioniert und es so aussieht, wie es sein sollte.Wie führe ich Django-Piston dazu, verwandte untergeordnete Objekte in die serialisierte Ausgabe einzubeziehen?

Ich benutze Django-Kolben, um eine API zu entwickeln und haben 2 Modelle, Building and Building Area.

BuildingArea hat einen Fremdschlüssel zum Gebäude, da es mehrere Bereiche in einem Gebäude gibt. Die 'related_name'-Eigenschaft für den FK ist' Bereiche ', so dass ich von einem gegebenen Gebäude aus auf die BuildingAreas zugreifen kann.

Das Problem ist, dass alles im Admin gut aussieht, aber wenn ich den Endpunkt /api/building.json triff, bekomme ich es das Building-Objekt ohne die geschachtelten BuildingArea-Objekte, die im JSON enthalten sind.

Ich hätte gedacht, dass Django-Piston standardmäßig Reverse FK Felder folgen würde oder fehlt mir etwas?

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 

Antwort

19

Ok, ich habe es endlich funktioniert nach dem Debugging durch emitters.py und zur Kenntnis nehmen, wie es die "Felder" -Eigenschaft des Handlers verwendet, um die Modellfelder zu iterieren.

Das sind meine Modelle:

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 

Dies ist, was mein BuildingHandler jetzt aussieht:

class BuildingHandler(BaseHandler): 

    allowed_methods = ('GET',)  
    fields = ('address', ('areas', ('display_name',),),)  
    model = Building 

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

Wichtig ist hier zu beachten ist, dass emmitters.py bestimmte aktiviert wird Codepläne nur, wenn die aktuelle Felddefinition eine Menge oder eine Liste ist. Ich hatte vergessen, den Sets, die zum Definieren der Felder verwendet wurden, ein abschließendes ',' hinzuzufügen, was dazu führte, dass Python eine Menge von Zeichen zurückgab, die in der Zeichenkette 'Anzeigename' enthalten waren, statt einer Menge, die die Zeichenkette 'enthielt. Anzeigename'. Ich hoffe, dass es Sinn gemacht hat, Google 'Python Single Set Nachkomma' für weitere Informationen.

Hoffentlich hilft das jemand anderem! : D

+0

ZEHN TAUSEND Upvotes zu Ihnen Herr (oder Frau). Oder mindestens eins. Irgendwie muss ich das vermisst haben. Piston überrascht mich immer wieder. – winsmith

+0

So verrückt wie ich dachte, diese Antwort war, das ist die richtige. +1 und Lesezeichen für wenn ich es vergesse. –

+0

Das hat mir jetzt viel Zeit gespart. – julkiewicz

0

Auf BuildingHandler, tun:

fields = ('address', 'areas') 

Das sollte es tun.

+0

Ok Ich muss etwas gestopft haben, weil ich dachte, ich hätte das schon probiert. Ich werde es versuchen und melden. – Ashemah

+0

Ok ich habe das versucht und es funktioniert immer noch nicht - Ausgabe ist: [{"Bereiche": "", "Adresse": "42 Frigate Crescent"}] Aber es ist definitiv ein BuildingArea in der DB mit seiner Beziehung richtig eingerichtet, um auf Gebäude zu zeigen. – Ashemah

Verwandte Themen