Skip to main content
 首页 » 编程设计

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

2025年05月04日50dyllove98

我正在尝试在模型序列化器中添加一个新字段,它将向另一个模型显示该模型的所有相关值。

就像我有以下内容:

模型.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 

序列化器.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')), 
] 

现在我正在使用 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/" 
} 

现在当我点击 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" 
    } 
]  

然后单击 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 
    } 
] 

因此,由于学生没有特定的大学,所以我想添加一所大学的学生 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} 
    } 
]  

该怎么做?

请您参考如下方法:

您可以使用 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 

希望这有帮助:)