我正在尝试使用djangoRestframework django-rest在我的django应用程序中创建REST服务。
我在MyModels.py中有模型学生,后面是
from django.db import models
class Student(object) :
def __init__(self,first_name,middle_name,last_name,subject_list=None):
self.first_name = first_name
self.last_name = last_name
self.middle_name = middle_name
self.subject_list = subject_list
class Subject(object) :
def __init__(self,name):
self.name = name
以下代码来自views.py
def getStudentList(request):
my_list = []
my_list.append(Student(first_name="Alajandro",middle_name="Santana",last_name="Gonzales"))
my_list.append(Student(first_name="Timothy",middle_name="Carlos",last_name="Robins"))
my_list.append(Student(first_name="Nathan",middle_name="Nick",last_name="Mathews"))
my_list.append(Student(first_name="John",middle_name="Nelson",last_name="Kennedy"))
my_list.append(Student(first_name="Tom",middle_name="Kenny",last_name="Cruise"))
my_list.append(Student(first_name="Jerry",middle_name="Sanvile",last_name="McGuire"))
my_list.append(Student(first_name="Jason",middle_name="San",last_name="Statham"))
student_list = []
for student in my_list:
student_ser = rest.StudentSerialize(student)
student_list.append(student_ser.data.copy())
json = JSONRenderer().render(student_list)
return HttpResponse(json)
urls.py中的网址映射是
url(r'^studentList/', views.getStudentList),
响应来自URL http://127.0.0.1:8083/studentList/
是
[{"first_name":"Alajandro","middle_name":"Santana","last_name":"Gonzales"},{"first_name":"Timothy","middle_name":"Carlos","last_name":"Robins"},{"first_name":"Nathan","middle_name":"Nick","last_name":"Mathews"},{"first_name":"John","middle_name":"Nelson","last_name":"Kennedy"},{"first_name":"Tom","middle_name":"Kenny","last_name":"Cruise"},{"first_name":"Jerry","middle_name":"Sanvile","last_name":"McGuire"},{"first_name":"Jason","middle_name":"San","last_name":"Statham"}]
现在如果我有兴趣在json中传递主题。我想做的是学生和科目之间的一对多关系。即一名学生可以有很多科目。
所以我期待这个json作为输出
[{
"name" : "Tom",
"subject_list" : [{..},{},{},....]
},{},{}...]
为此,我在代码中进行了以下更改
我的MyModel.py文件
from django.db import models
class Student(object) :
def __init__(self,first_name,middle_name,last_name,subject_list=None):
self.first_name = first_name
self.last_name = last_name
self.middle_name = middle_name
if subject_list is None:
self.subject_list = subject_list
class Subject(object) :
def __init__(self,name):
self.name = name
我的MyREST.py包含
from MyModels import Student
from MyModels import Subject
from rest_framework import serializers
class StudentSerialize(serializers.Serializer):
first_name = serializers.CharField(max_length=200)
middle_name = serializers.CharField(max_length=200)
last_name = serializers.CharField(max_length=200)
我的views.py包含
def get_student_list(request):
my_list = []
my_list.append(Student(first_name="Alajandro",middle_name="Santana",last_name="Gonzales"))
my_list.append(Student(first_name="Timothy",middle_name="Carlos",last_name="Robins"))
my_list.append(Student(first_name="Nathan",middle_name="Nick",last_name="Mathews"))
my_list.append(Student(first_name="John",middle_name="Nelson",last_name="Kennedy"))
subject_list = []
subject_list.append(Subject(name="Computer Science"))
subject_list.append(Subject(name="Physics"))
subject_list.append(Subject(name="Chemistry"))
my_list.append(Student(first_name="Jason",middle_name="San",last_name="Statham",subject_list=subject_list))
my_list.append(Student(first_name="Tom",middle_name="Kenny",last_name="Cruise",subject_list=subject_list))
my_list.append(Student(first_name="Jerry",middle_name="Sanvile",last_name="McGuire",subject_list=subject_list))
student_list = []
for student in my_list:
student_ser = rest.StudentSerialize(student)
student_list.append(student_ser.data.copy())
json = JSONRenderer().render(student_list)
return HttpResponse(json)
在urls.py中我添加了
url(r'^student_list/', views.get_student_list),
现在,如果我点击了URL,我仍然会将json输出为
[{"first_name":"Alajandro","middle_name":"Santana","last_name":"Gonzales"},{"first_name":"Timothy","middle_name":"Carlos","last_name":"Robins"},{"first_name":"Nathan","middle_name":"Nick","last_name":"Mathews"},{"first_name":"John","middle_name":"Nelson","last_name":"Kennedy"},{"first_name":"Jason","middle_name":"San","last_name":"Statham"},{"first_name":"Tom","middle_name":"Kenny","last_name":"Cruise"},{"first_name":"Jerry","middle_name":"Sanvile","last_name":"McGuire"}]
但我没有得到这些科目。
我应该在课程SudentSerialize中添加什么,这样如果我在学生的对象中设置subject_list,我将获得学生的json属性subject_list将具有主题json数组。
答案 0 :(得分:1)
您必须使用嵌套的关系来完成这项工作:
这是一个例子:
class SubjectSerializer(serializers.Serializer):
name = serializers.CharField(max_length=200)
class Meta:
fields = [
'name',
]
class StudentSerializer(serializers.Serializer):
first_name = serializers.CharField(max_length=200)
middle_name = serializers.CharField(max_length=200)
last_name = serializers.CharField(max_length=200)
# nested relationship
subjects = SubjectSerializer(many=True)
class Meta:
fields = [
'first_name',
'last_name',
'middle_name',
'subjects'
]
答案 1 :(得分:0)
您正在寻找nested serializers。 文档应涵盖您需要了解的所有内容。
请花一些时间来运行tutorial的6个步骤。它将为您提供有关如何使用DRF的提示。