Pesutatud suhted Django Rest raamistiku OneToOne väljade serialisaatorites

Django Rest Framework (DRF) on üks Django ümber tõhusalt kirjutatud raamistikke ja aitab luua REST API-sid rakenduse tagatipuks.

Kasutasin seda ühes oma isiklikus projektis ja komistasin sellele väljakutsele „mudeli järjestamine, mis viitab OneToOne'i välja kaudu teisele mudelile”.

"Kasutasin kasutaja mudelit alates django.contrib.auth.models. Tahtsin kirjutada API kasutajaobjekti loomiseks ja värskendamiseks ühe API kaudu, mis värskendab ka minu mudeli atribuute. Lahenduseks oli DRF-i pesastatud suhete kasutamine serialiseerimisel.

Eeldan, et teil on enne jätkamist õiged teadmised Pythoni, virtualenv, pipi, Django ja DRF kohta. Kui ei, siis palun lugege lisateavet ja naaske julgelt, kui olete serialiseerimisel kunagi kinni pesastatud suhetes.

Näide, mida siin kaalun, on ülikooli üliõpilase mudel, viidates kasutajamudelile välja OneToOne kaudu. Minu eesmärk on üks API kasutajaandmete, nagu nimi, kasutajanimi ja e-post, loomiseks ja hankimiseks koos õpilase atribuudiga nagu õppeaine.

Minu models.pyvälimus on järgmine:

from django.db import models from django.contrib.auth.models import User class UnivStudent(models.Model): """ A class based model for storing the records of a university student Note: A OneToOne relation is established for each student with User model. """ user = models.OneToOneField(User) subject_major = models.CharField(name="subject_major", max_length=60)

Järgmisena määrab ülaltoodud mudeli serialiseerija atribuudid, millega manipuleerida. Kui jälgite allpool, on mul kaks serialiseerija klassi,UserSerializerja StudentSerializer.See on meie huvipunkt.

Olen siin deklareerinud useratribuudi, mis on serialiseerimisväli. See useratribuut hoiab peamiselt kogu UserSerializerklassi viidet . Aastal väljad on StudentSerializer, me lihtsalt näha " user" ja " subject_major". See võimaldab meil sisestada õpilase (või kasutaja) atribuudid koos subjekti_major juurde.

Luuakse kasutajakirje, millele viitab õpilase kirje. Alistame loomise meetodi kõigepealt objekti StudentSerializerloomiseks userja kasutame seda studentobjekti loomiseks .

See serializer.py on järgmine:

from rest_framework import serializers, status from models import * class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('username', 'first_name', 'last_name', 'email') class StudentSerializer(serializers.ModelSerializer): """ A student serializer to return the student details """ user = UserSerializer(required=True) class Meta: model = UnivStudent fields = ('user', 'subject_major',) def create(self, validated_data): """ Overriding the default create method of the Model serializer. :param validated_data: data containing all the details of student :return: returns a successfully created student record """ user_data = validated_data.pop('user') user = UserSerializer.create(UserSerializer(), validated_data=user_data) student, created = UnivStudent.objects.update_or_create(user=user, subject_major=validated_data.pop('subject_major')) return student

See views.pypeaks olema üsna sirgjooneline, kui olete Django klassipõhiste vaadetega juba tuttav. Mudeliobjektide valideerimiseks ja loomiseks kasutame serialiseerijat:

from serializers import * from models import * from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class StudentRecordView(APIView): """ A class based view for creating and fetching student records """ def get(self, format=None): """ Get all the student records :param format: Format of the student records to return to :return: Returns a list of student records """ students = UnivStudent.objects.all() serializer = StudentSerializer(students, many=True) return Response(serializer.data) def post(self, request): """ Create a student record :param format: Format of the student records to return to :param request: Request object for creating student :return: Returns a student record """ serializer = StudentSerializer(data=request.data) if serializer.is_valid(raise_exception=ValueError): serializer.create(validated_data=request.data) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.error_messages, status=status.HTTP_400_BAD_REQUEST)

Olen kaasanud ülikooli üliõpilaste /univstud/url saavutamiseks postja gettaotluste jaoks.

from django.conf.urls import patterns, include, url from django.contrib import admin from rest_framework import routers from rest_framework.urlpatterns import format_suffix_patterns from OneToOne import views admin.autodiscover() router = routers.DefaultRouter() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace="rest_framework")), ) urlpatterns += format_suffix_patterns([ # API to map the student record url(r'^api/univstud/$', views.StudentRecordView.as_view(), name="students_list"), ])

POSTTaotluse kõne näeks midagi sellist:

GetTaotluse kõne näeks midagi sellist:

See on kõik!:)

Pesastatud suhe on seega StudentSerializerviidatud user.

Täielik kood on minu gitlabi hoidlas.

Viited:

  1. //www.django-rest-framework.org/api-guide/relations/