[PYTHON] [Django] Übergeben Sie die von der API authentifizierte Benutzerinstanz an ModelSerializer

Es ist ein wenig verstopft, machen Sie sich also eine Notiz.

Umgebung

Informationen zum ModelSerializer

Im Django-Rest-Framework (im Folgenden: DRF) wird die Konvertierung zwischen Json und Model über ein Objekt namens ModelSerializer durchgeführt. Wenn Sie den von der API empfangenen Wert bearbeiten und registrieren, einen nicht in der Tabelle vorhandenen Datensatz zurückgeben, die Daten verarbeiten und in Json konvertieren, wird dem Serializer häufig eine Methode hinzugefügt.

Wenn in DRF eine Tokenauthentifizierung durchgeführt wird, wird die Benutzerinstanz im Anforderungsobjekt gespeichert. Wenn Sie eine Benutzerinstanz an Serializer übergeben, kann der Wert des Beziehungsziels automatisch eingegeben werden, sodass viele Verwendungsszenen vorhanden sind.

model

Das vorausgesetzte Besuchermodell lautet wie folgt.

import uuid
from django.db import models
from api.models import AppUser
from web.models import AdminUser


class Visitor(models.Model):
    class Meta:
        db_table = "visitor"
        verbose_name_plural = 'Besucher'

    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    parent_user = models.ForeignKey(AdminUser,
                                    on_delete=models.CASCADE,
                                    related_name='visitor')
    name = models.CharField(max_length=50)
    email = models.EmailField(max_length=255, null=True, blank=True)
    company = models.CharField(max_length=50, blank=True, null=True)
    memo = models.TextField(blank=True, null=True, max_length=300)
    visit_count = models.PositiveIntegerField(default=0)
    created_by = models.ForeignKey(AppUser,
                                   on_delete=models.SET_NULL,
                                   null=True, blank=True,
                                   related_name='visitor')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

serializer

Der Serializer erstellt Felder, die dem Modell zugeordnet sind. Um den Wert willkürlich zu ändern, überschreiben Sie ihn mit "SerializerMethodField ()". Das durch "SerializerMethodField ()" definierte Feld ruft die Methode "get_ " auf und speichert den Rückgabewert.

Die Methode von "get_ " hat "Instanz" als Argument. Daher dachte ich, dass es hier übergeben würde, wenn die API-Authentifizierung durchgeführt wurde, aber es scheint, dass die zum Zeitpunkt der Erstellung selbst erstellte Instanz hier übergeben wird. (Wenn Sie dies verwenden, können Sie automatisch die Daten des Beziehungsziels erstellen.)

from rest_framework.serializers import ModelSerializer, SerializerMethodField

class VisitorCreateSerializer(ModelSerializer):
    created_by = SerializerMethodField()
    parent_user = SerializerMethodField()

    class Meta:
        model = Visitor
        read_only_fields = (
            'pk',
            'created_at',
            'created_by',
        )
        fields = (
            'pk',
            'parent_user',
            'created_at',
            'name',
            'email',
            'company',
            'memo',
            'updated_at',
        )

    def get_created_by(self, instance):
        """Der sendende Benutzer wird erstellt_Gespeichert von"""
        return str(instance.pk)

    def get_parent_user(self, instance):
        """parent_Benutzer automatisch speichern"""
        return str(instance.parent_user.pk)

ViewSet

In der Ansicht gibt es einen Teil, der den Serializer instanziiert. Wenn Sie also den Benutzer hier an die Instanz übergeben, ist dies in Ordnung. Dieses Mal wollte ich den Serializer nur zum Erstellen trennen, daher habe ich die Erstellungsmethode überschrieben und den Serializer angegeben.

# DRF
from rest_framework import status, viewsets
from rest_framework.permissions import IsAuthenticated
from .serializers import VisitorSerializer, VisitorCreateSerializer
from .models import Visitor
from utils.auth.authentication import APIAuthentication
from rest_framework.response import Response


class VisitorViewSet(viewsets.ModelViewSet):
    serializer_class = VisitorSerializer #Serializer wird anders als create verwendet
    queryset = Visitor.objects.all()

    authentication_classes = (APIAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        #Wenn die API-Authentifizierung durchgeführt wird,Benutzerinstanz ist Anfrage.Im Benutzer gespeichert.
        admin = self.request.user.parent_user
        qs = Visitor.objects.filter(parent_user=admin)
        return qs

    #Überschreiben Sie die Erstellungsmethode
    def create(self, request, *args, **kwargs):
        #Anfrage an Serializer.Wenn Sie Benutzer übergeben, erhalten_<Feldname>Die Instanz wird an die Methode übergeben
        serializer = VisitorCreateSerializer(instance=request.user, data=request.data)
        #Von hier weiter runter
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Recommended Posts

[Django] Übergeben Sie die von der API authentifizierte Benutzerinstanz an ModelSerializer
Übergeben Sie Login-Benutzerinformationen, um sie in Django anzuzeigen
Ermöglicht die Auswahl nach Namen aus dem Django-Benutzernamen
Übergeben Sie den Text an Django genericview
[Pfeffer] Übergibt die gesamten JSON-Daten, die durch Python-Anforderung erhalten wurden, an das Tablet.
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Stellen Sie das Django-Lernprogramm für IIS bereit ①
[Django] So übergeben Sie Werte direkt von Vorlagen-Tags an JavaScript-Variablen
So überprüfen Sie die Version von Django
Versuchen Sie, sich der Teilsumme zu stellen
Ich habe versucht, die COTOHA-API zu berühren
Benutzerinformationen usw. in das Django-Protokoll ausgeben
Versuchen Sie, die Spotify-API in Django zu aktivieren.
Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.
[Django-Memo] Ich möchte die angemeldeten Benutzerinformationen im Voraus im Formular festlegen.
Das Format der von der Slack-API erhaltenen Nachricht ist auf subtile Weise schwierig zu verwenden
Ich habe versucht, den G-Test und die E-Qualifikation durch Training ab 50 zu bestehen