Сериализация субобъекта с внешним ключом с помощью фреймворка Django rest

сериализация с помощью Django Rest framework

models.py

from django.db import models

class University( models.Model ):
    name = models.CharField( max_length = 50 )
    createdTime = models.DateTimeField( auto_now_add=True )
    updatedTime = models.DateTimeField( auto_now_add=True )

    class Meta:
       verbose_name = "University"
       verbose_name_plural = "Universities"

    def __unicode__( self ):
        return self.name

class Student( models.Model ):
    first_name = models.CharField( max_length = 50 )
    .......
    university = models.ForeignKey( University )
    .......

    @property
    def get_lookupName( self ):
        return self.first_name + self.last_name

    class Meta:
        verbose_name = "Student"
        verbose_name_plural = "Students"

    def __unicode__( self ):
        return '%s %s' % ( self.first_name , self.last_name )

serializers.py

from rest_framework import serializers
from .models import University, Student

class UniversitySerializer( serializers.ModelSerializer ):
    class Meta:
        model = University
        fields = ( 'id' , 'name' )

class StudentSerializer( serializers.ModelSerializer ):
    class Meta:
        model = Student

When i do a get on / студенты/1
я получаю это представление в json

{
    "id": 1,
    "first_name": "Alok",
    "last_name": "Kumar",
    ..........
    "email_alt2": "something@invalid2.com",
    "university": 1
}

но я хочу это представление :

{
    "id": 1,
    "first_name": "YYYYYY",
    ........
    "email_alt2": "something@invalid2.com",
    "university": {
            "id": 1,
            "name": XXXXX"",
            "links":[
                {
                    "rel": "self",
                    "href": ".....api/universities/1"
                }
             ]
        }
  }

Нужно ли будет написать пользовательский сериализатор для этого ?

2 ответа

  1. Попробуйте hyperlinkedmodelserializer drf . Сериализатор может выглядеть следующим образом.

    из сериализаторов импорта rest_framework
    от.модели импорт университет, студент

    class UniversitySerializer( serializers.ModelSerializer ):
        class Meta:
            model = University
            fields = ( 'id' , 'name' )
    
    class StudentSerializer( serializers.HyperlinkedModelSerializer ):
        class Meta:
            model = Student
    

    Если вы хотите больше пример вы можете найти простой здесь

  2. Ваш сериализатор нежизнеспособности не включен в StudentSerializer, поэтому вы должны добавить это.

    class UniversitySerializer( serializers.ModelSerializer ):
        class Meta:
            model = University
            fields = ( 'id' , 'name' )
    
    class StudentSerializer( serializers.ModelSerializer ):
        # you need to add this
        university  = UniversitySerializer(many=False,read_only=True)
        class Meta:
            model = Student