Es ist ein wenig verstopft, machen Sie sich also eine Notiz.
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_
Die Methode von "get_
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