Alok
Alok

Reputation: 11

Serializing subobject with foreign key with Django rest framework

serialization with 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 /students/1 i get this representation in json

{
    "id": 1,
    "first_name": "Alok",
    "last_name": "Kumar",
    ..........
    "email_alt2": "[email protected]",
    "university": 1
}

but i want this representation :

{
    "id": 1,
    "first_name": "YYYYYY",
    ........
    "email_alt2": "[email protected]",
    "university": {
            "id": 1,
            "name": XXXXX"",
            "links":[
                {
                    "rel": "self",
                    "href": ".....api/universities/1"
                }
             ]
        }
  }

Will i need to write a custom serializer for this ?

Upvotes: 1

Views: 944

Answers (2)

dmitryro
dmitryro

Reputation: 3506

Your Unviersity serializer is not icluded in StudentSerializer, so you have to add this.

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

Upvotes: 1

cutteeth
cutteeth

Reputation: 2213

Try drf's hyperlinkedmodelserializer. Your serializer may look like below.

from rest_framework import serializers from .models import University, Student

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

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

If you want more example you can find a simple one here

Upvotes: 0

Related Questions