Автор оригинала: Bharath Kallur.
Django Restand Framework ( DRF ) – одна из эффективных написанных структур вокруг Django и помогает создать API для отдыха для возврата приложения.
Я использовал его в одном из моих личных проектов и наткнулся на эту проблему «сериализации модели, которая ссылается на другую модель через OneToone Field ».
`Я использовал Пользователь модель от django.contrib.auth.models Отказ Я хотел написать API для создания и обновления объекта пользователя через один API, который также обновляет атрибуты моей модели. Решение было использовать DRF Вложенные отношения в сериализации.
Предполагаю, что у вас есть справедливое знание Python, Virtualenv, Pip, Django и DRF, прежде чем продолжить. Если нет, пожалуйста, узнайте больше и не стесняйтесь вернуться, если вы когда-либо застряли на вложенных отношениях в сериализации.
Пример, который я думаю здесь, это Студент университета Модель, ссылка Пользователь Модель через OneToone поле. Моя цель – это единственное API для создания и получения пользовательских деталей, как имя, имя пользователя и электронное письмо, а также атрибут студента, такого как субъект.
Вот как мой Models.py Выглядит:
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)
Затем сериализатор для вышеуказанной модели определяет атрибуты для манипулирования. Если вы наблюдаете ниже, у меня есть 2 классов сериализатора, Userserializer и Студенциализатор
Отказ Это наша достопримечательность.
Я объявил Пользователь
атрибут, который здесь сериализатор здесь. Что Пользователь
Атрибут в первую очередь удерживает всю ссылку на Userserializer
класс. В Поля Студенциализатор
Мы просто видим « » Пользователь
‘и’ dublic_major
‘. Это позволяет нам вводить атрибуты Student (или пользователя) вместе с Tublic_major.
Создается запись пользователя, на которую ссылается запись студента. Мы переопределяем метод создания Студенциализатор
создать Пользователь
Сначала объект и используйте это для создания Студент
объект.
serializer.py составляет:
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
просмотр .py должно быть довольно простым, если вы уже знакомы с Классовые виды Джанго. Мы будем использовать сериализатор для проверки и создания моделей объектов:
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)
Я включил /univstud/
URL
Для достижения пост
и получить
Запросы на студенту университета.
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'), ])
Пост Свяжитесь с звонком будет выглядеть что-то подобное:
Получить Свяжитесь с звонком будет выглядеть что-то подобное:
Это все!:)
Таким образом, вложенные отношения включены на Студенциализатор ссылаться Пользователь
Отказ
Полный код в мой gitlab Репозиторий.