繁体   English   中英

如何将复杂的Django模型序列化为json?

[英]How will I serialize complex Django Models to json?

我正在尝试使用djangoRestframework django-rest在django应用程序中创建REST服务。

我在MyModels.py中有模型Student,如下所示,

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映射是

 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类中添加什么,以便如果我在student对象中设置subject_list,我将获得Student的json,而subject_list属性将具有subject json数组。

您必须使用嵌套的关系来完成此工作:

这是一个例子:

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'
        ]

阅读Django Rest Framework-嵌套关系以获取更多信息

您正在寻找嵌套的序列化器 该文档应涵盖您需要了解的所有内容。

请花一些时间来运行本教程的6个步骤。 它将为您提供有关如何使用DRF的提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM