12 Stimmen

Wie bringe ich Django-Piston dazu, verwandte Unterobjekte in die serialisierte Ausgabe aufzunehmen?

Ich raufe mir hier die Haare, weil es bei mir nicht funktioniert, obwohl es eigentlich so sein sollte.

Ich bin mit Django-Piston, eine API zu entwickeln und haben 2 Modelle, Gebäude und Gebäudebereich.

BuildingArea hat einen ForeignKey zu Building, da es mehrere Bereiche in einem Gebäude gibt. Die Eigenschaft "related_name" für den FK ist "areas", sodass ich von einem bestimmten Gebäude aus auf die BuildingAreas zugreifen kann.

Das Problem ist, dass alles in Admin gut aussieht, aber wenn ich den Endpunkt /api/building.json aufrufe, erhalte ich nur das Building-Objekt ohne die verschachtelten BuildingArea-Objekte, die im JSON enthalten sind.

Ich hätte gedacht, dass Django-Piston standardmäßig umgekehrten FK-Feldern folgen würde, oder übersehe ich 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

19voto

Ashemah Punkte 410

Ok, so habe ich es endlich nach Debugging durch emitters.py und bemerken, wie es die 'Felder' Eigenschaft des Handlers verwendet, um die Modellfelder zu durchlaufen.

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 

So sieht mein BuildingHandler jetzt aus:

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, dass emmitters.py bestimmte Codepfade nur dann aktiviert, wenn die aktuelle Felddefinition eine Menge oder eine Liste ist. Ich hatte vergessen, ein abschließendes ',' an die zur Definition der Felder verwendeten Sets anzuhängen, und dies führte dazu, dass Piston Python veranlasste, ein Set aus den in der Zeichenkette 'display_name' enthaltenen Zeichen zurückzugeben, anstatt ein Set, das die Zeichenkette 'display_name' enthält. Ich hoffe, das hat Sinn gemacht. Google 'Python single set trailing comma' für weitere Informationen.

Hoffentlich hilft das jemand anderem! :D

0voto

jespern Punkte 29978

Auf BuildingHandler, tun:

fields = ('address', 'areas')

Das sollte genügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X