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)
怎么做?
您可以为此使用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)
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |