3 Stimmen

Context Aware Browsable API Rendering in Django REST

Gibt es eine einfache Möglichkeit, Hyperlinks in der Django Rest Browsable API zu erstellen, aber nicht in den anderen API-Darstellungen. Um es klar auszudrücken, möchte ich bestimmte Felder als Hyperlinks rendern, wenn die Seite über die browsable API angezeigt wird, aber nur den Textkomponenten rendern, wenn sie über JSON gerendert wird.

Ein Beispiel für diese Verwendung ist es, den pk im Listenansicht als Hyperlink zur Detailansicht zu rendern (ähnlich wie: http://chibisov.github.io/drf-extensions/docs/#resourceurifield), aber dies nur anzeigen, wenn die Listenansicht im browsable API-Modus angezeigt wird. Im regulären JSON GET möchte ich nur den pk rendern.

Meine Hoffnung ist es, die browsable API benutzerfreundlicher/navigierbarer zu machen, wenn sie über einen Browser zugegriffen wird.

Ist das in irgendeiner Weise relevant: http://www.django-rest-framework.org/api-guide/renderers#browsableapirenderer?

Allgemeiner gefragt, gibt es irgendeine Möglichkeit, die Ausnahmen abhängig vom Rendierungsmodus festzulegen?

3voto

Tom Christie Punkte 32056

Sie können in verschiedenen Kontexten unterschiedliche Serialisierer zurückgeben, indem Sie die Methode get_serializer auf GenericAPIView oder einer seiner Unterklassen überschreiben.

Etwas in dieser Art wäre angemessen...

def get_serializer(self, ...):
    if self.request.accepted_renderer.format == 'api':
        # Darstellung im Browser-Stil
    else:
        # Standardstil

Wenn Sie dieses Verhalten als Mixin-Klasse kodieren würden, könnten Sie es dann problemlos in Ihren Ansichten wiederverwenden.

1voto

Alex Rothberg Punkte 9208

Ich habe diese Mischung erstellt, um die serializer_class_api im API-Modus zu verwenden:

class SerializerAPI(object):
    def get_serializer_class(self, *args, **kwargs):
        parent = super(SerializerAPI, self).get_serializer_class(*args, **kwargs)
        if (hasattr(self.request, 'accepted_renderer') and 
          self.request.accepted_renderer.format == 'api'):
            return self.serializer_class_api
        else:
            return parent

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