如何在Django Rest Framework中列出相关对象

shu*_*hpy 1 python django rest django-models 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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')),
]
Run Code Online (Sandbox Code Playgroud)

现在我正在使用django-rest-framework编写rest-api,所以我得到这样的

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/"
}
Run Code Online (Sandbox Code Playgroud)

现在,当我单击http://127.0.0.1:8000/api/universities/时。我懂了

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"
    }
] 
Run Code Online (Sandbox Code Playgroud)

然后点击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
    }
]
Run Code Online (Sandbox Code Playgroud)

因此,由于学生有一所特定的大学,所以我想添加一所大学的学生ID列表。喜欢

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}
    }
] 
Run Code Online (Sandbox Code Playgroud)

怎么做?

Sag*_*gar 5

您可以为此使用PrimaryKeyRelatedField。首先将related_name属性设置为您的外键。

university = models.ForeignKey(University, related_name='students')
Run Code Online (Sandbox Code Playgroud)

然后像这样更改序列化器。

class UniversitySerializer(serializers.ModelSerializer):
    students = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = University
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)