Рубрики
Без рубрики

Вложенные отношения в сериализаторах для онопонских полей в Django Rest Framework

Автор оригинала: 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 Репозиторий.

Рекомендации:

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