[PYTHON] Manchmal möchten Sie mit DRF (Django REST Framework) auf View information from Serializer zugreifen.

Unabhängig davon, ob dies gut ist oder nicht, gibt es Zeiten, in denen Sie über den Serializer auf Ansichtsinformationen zugreifen möchten. Wir verwenden ein praktisches Mixin, das in solchen Fällen intern verwendet werden kann. Je mehr Sie tun, desto stärker ist die Bindung zwischen View und Serializer. Wir empfehlen daher, die Verwendung und Dosierung __ zu befolgen.

Wie auch immer, es ist der Quellcode.

ViewAccessSerializerMixin

class ViewAccessSerializerMixin(object):

    def get_view_action(self):
        """
Zugriff auf View-Aktion über Serializer
        """
        context = getattr(self, 'context')
        if not context:
            warnings.warn('Der Kontext ist im Serializer nicht vorhanden. Die Instanz wird auf illegale Weise erstellt')
            return None
        return context.get('view').action

    def get_view_kw(self, key, default=None):
        """
Greifen Sie über Serializer auf View Warwar zu
        """
        context = getattr(self, 'context')
        if not context:
            warnings.warn('Der Kontext ist im Serializer nicht vorhanden. Die Instanz wird auf illegale Weise erstellt')
            return default
        return context.get('view').kwargs.get(key, default)

    def get_kwargs_object(self, key, model_class):
        """
Greifen Sie über den Serializer auf kwargs zu, betrachten Sie es als ID und suchen Sie nach dem angegebenen Modell
        """
        obj = model_class.objects.get_or_none(id=int(self.get_view_kw(key, 0)))
        if obj:
            return obj

Greifen Sie auf die Ansichtsaktion zu

Wird meistens bei der Validierung verwendet. Ich denke, es gibt wahrscheinlich bessere Bedingungen. So was.

class HogeSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):

    #Verschiedene Auslassungen

    def validate(self, attrs):
        #Ändern Sie den Überprüfungsinhalt abhängig von der Aktion
        action_name = self.get_view_action()
        if action_name == "xxxx":
            pass
        else:
            pass

Greifen Sie in View auf kwargs zu

Wird hauptsächlich in SerializerMethodField verwendet.

class PostHistorySerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):

    #Verschiedene Auslassungen

    comments = serializers.SerializerMethodField()

    def get_comments(self, obj):
        return obj.comment.filter(user_id=self.get_view_kw("user_pk"))

Greifen Sie in View auf kwargs zu, betrachten Sie es als ID und suchen Sie nach dem angegebenen Modell

Es ist nah an der Kombination von ↑, aber es ist eine Abkürzung.

class UserSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):

    #Verschiedene Auslassungen

    def validate(self, attrs):
        user = self.get_kwargs_object('user_pk', models.User)
        if user.is_ban():
          raise NotFound()
        pass

Grundsätzlich benutze ich es so. Ich hoffe, Sie können es bequem verwenden.

Recommended Posts

Manchmal möchten Sie mit DRF (Django REST Framework) auf View information from Serializer zugreifen.
Wenn Sie mit dem Django REST-Framework filtern möchten
So generieren Sie automatisch ein API-Dokument mit dem Django REST-Framework und POST vom Dokumentbildschirm
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
CRUD GET mit Nuxt & Django REST Framework ②
CRUD POST mit Nuxt & Django REST Framework
CRUD GET mit Nuxt & Django REST Framework ①
AssertNumQueries ist nützlich, wenn Sie N + 1-Abfragen einfach mit django testen möchten
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
CRUD PUT, DELETE mit Nuxt & Django REST Framework
Übergeben Sie Login-Benutzerinformationen, um sie in Django anzuzeigen
Django REST Framework Ein wenig nützlich zu wissen.
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Weitere neue Benutzerauthentifizierungsmethoden mit Django REST Framework
Einstellungen, wenn Sie Python-Mecab mit Travis ausführen möchten
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
Links, um mit Sublime Text zu tun, was Sie wollen
Weitergabe vertraulicher Informationen von SSM an ECS mit CloudFormation
Ermöglicht die Auswahl nach Namen aus dem Django-Benutzernamen
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Implementieren Sie hierarchische URLs mit drf-verschachtelten Routern im Django REST-Framework
ODBC-Zugriff auf SQL Server von Linux mit Python