2016-10-30 1 views
1

モデルシリアライザに新しいフィールドを追加しようとしていますが、このモデルの関連するすべての値を別のものに表示します。私は以下の持っているとして同様Django Rest Frameworkで関連するオブジェクトをリストする方法

models.py

from django.db import models 

class University(models.Model): 
    name = models.CharField(max_length=50) 

    def __unicode__(self): 
     return self.name 

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

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

views.py

from rest_framework import viewsets 
from .models import University, Student 
from .serializers import UniversitySerializer, StudentSerializer 

class StudentViewSet(viewsets.ModelViewSet): 
    queryset = Student.objects.all() 
    serializer_class = StudentSerializer 

class UniversityViewSet(viewsets.ModelViewSet): 
    queryset = University.objects.all() 
    serializer_class = UniversitySerializer 

serializers.py

from rest_framework import serializers 
from .models import University, Student 

class UniversitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = University 

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

urls.py

from rest_framework import routers 
from core.views import StudentViewSet, UniversityViewSet 
from django.conf import settings 
from django.conf.urls import url, include 
from django.contrib import admin 

router = routers.DefaultRouter() 
router.register(r'students', StudentViewSet) 
router.register(r'universities', UniversityViewSet) 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^api/', include('apps.core.urls', namespace='core')), 
] 

と私は今、この

HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "students": "http://127.0.0.1:8000/api/students/", 
    "universities": "http://127.0.0.1:8000/api/universities/" 
} 

ときのように取得するように、今私はジャンゴ・休息・フレームワークを使用して、残り-APIを書いています私はhttp://127.0.0.1:8000/api/universities/をクリックします。私は、学生が何ので、私は大学で学生のIDのリストを追加したい特定の大学を持っていないようにhttp://127.0.0.1:8000/api/students/

HTTP 200 OK 
Allow: GET, POST, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

[ 
    { 
     "id": 35, 
     "first_name": "Gugu", 
     "last_name": "Gaga", 
     "university": 11 
    }, 
    { 
     "id": 36, 
     "first_name": "qwer", 
     "last_name": "abcd", 
     "university": 12 
    } 
] 

をクリックする上

HTTP 200 OK 
Allow: GET, POST, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

[ 
    { 
     "id": 1, 
     "name": "test42" 
    }, 
    { 
     "id": 2, 
     "name": "xxxxxx1222" 
    }, 
    { 
     "id": 3, 
     "name": "MIT" 
    } 
] 

及びこれを取得します。 Like

HTTP 200 OK 
Allow: GET, POST, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

[ 
    { 
     "id": 1, 
     "name": "test42" 
     "students" : {42,56,78} 
    }, 
    { 
     "id": 2, 
     "name": "xxxxxx1222" 
     "students" : {2,6,8} 
    }, 
    { 
     "id": 3, 
     "name": "MIT" 
     "students" : {4,5,7} 
    } 
] 

どうすればよいですか?

答えて

3

これにはPrimaryKeyRelatedFieldを使用できます。まず外部キーにrelated_name属性を設定します。

university = models.ForeignKey(University, related_name='students') 

このようにシリアライザを変更してください。

class UniversitySerializer(serializers.ModelSerializer): 
    students = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
    class Meta: 
     model = University 

希望はこのことができます:)

+0

おかげでブロ!私のディワリを救った!ハッピーディワリ:D – shubhpy

+0

ハッピーディワリ:) – Sagar

関連する問題