Python Django rest框架序列化程序未提供预期输出
我有一个django模型,看起来像这样:Python Django rest框架序列化程序未提供预期输出,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个django模型,看起来像这样: class AcademicProgramsManager(models.Manager): def get_by_natural_key(self, acad_program_id, program_title, required_credits): return self.get(acad_program_id = acad_program_id, program_title = program_title, required
class AcademicProgramsManager(models.Manager):
def get_by_natural_key(self, acad_program_id, program_title, required_credits):
return self.get(acad_program_id = acad_program_id, program_title = program_title, required_credits = required_credits)
class AcademicPrograms(models.Model):
objects = AcademicProgramsManager()
acad_program_id = models.IntegerField(primary_key=True)
acad_program_category = models.ForeignKey(AcademicProgramCategories)
acad_program_type = models.ForeignKey(AcademicProgramTypes)
acad_program_code = models.CharField(max_length=25)
program_title = models.CharField(max_length=64)
required_credits = models.IntegerField()
min_gpa = models.FloatField()
description = models.CharField(max_length=1000)
def natural_key(self):
return (self.acad_program_id, self.program_title, self.required_credits)
class StudentAcademicPrograms(models.Model):
student = models.ForeignKey(Students)
academic_program = models.ForeignKey(AcademicPrograms)
credits_completed = models.IntegerField()
academic_program_gpa = models.FloatField()
primary_program = models.BooleanField()
from studentapp.models import AcademicPrograms, AcademicProgramsManager, StudentAcademicPrograms
from studentapp.serializers import StudentAcademicProgramsSerializer, AcademicProgramsSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
class StudentAcademicProgramsList(APIView):
def get(self, request, format=None):
studentacademicprograms = StudentAcademicPrograms.objects.all()
serialized_studentacademicprograms = StudentAcademicProgramsSerializer(studentacademicprograms, many=True)
return Response(serialized_studentacademicprograms.data)
class StudentAcademicProgramsDetail(APIView):
def get_onjects(self, pk):
try:
return StudentAcademicPrograms.object.get(pk=pk)
except StudentAcademicPrograms.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
studentacademicprogram = self.get_object(pk)
serialized_studentacademicprogram = StudentAcademicProgramsSerializer(studentacademicprogram)
return Response(serialized_studentacademicprogram.data)
[
{
"credits_completed": 32,
"academic_program_gpa": 3.7,
"primary_program": true
},
{
"credits_completed": 32,
"academic_program_gpa": 3.4,
"primary_program": false
}
]
[
{
"pk": 1,
"fields": {
"academic_program": [
"acad_program_id": 124,
"program_title": "Associate in Arts Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": true,
"student": 1206,
"academic_program_gpa": 3.7
}
},
{
"pk": 2,
"fields": {
"academic_program": [
"acad_program_id": 123,
"program_title": "Associate in Sciences Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": false,
"student": 1206,
"academic_program_gpa": 3.4
}
}
]
这是我的serializers.py文件:
from studentapp.models import AcademicPrograms, AcademicProgramsManager, StudentAcademicPrograms
from rest_framework import serializers
class StudentAcademicProgramsSerializer(serializers.ModelSerializer):
class Meta:
model = StudentAcademicPrograms
fields = ('credits_completed','academic_program_gpa','primary_program')
class AcademicProgramsSerializer(serializers.ModelSerializer):
studentacademicprograms = StudentAcademicProgramsSerializer(many = True)
class Meta:
model = AcademicPrograms
fields = ('acad_program_id','program_title','required_credits','studentacademicprograms')
我的api.py文件如下所示:
class AcademicProgramsManager(models.Manager):
def get_by_natural_key(self, acad_program_id, program_title, required_credits):
return self.get(acad_program_id = acad_program_id, program_title = program_title, required_credits = required_credits)
class AcademicPrograms(models.Model):
objects = AcademicProgramsManager()
acad_program_id = models.IntegerField(primary_key=True)
acad_program_category = models.ForeignKey(AcademicProgramCategories)
acad_program_type = models.ForeignKey(AcademicProgramTypes)
acad_program_code = models.CharField(max_length=25)
program_title = models.CharField(max_length=64)
required_credits = models.IntegerField()
min_gpa = models.FloatField()
description = models.CharField(max_length=1000)
def natural_key(self):
return (self.acad_program_id, self.program_title, self.required_credits)
class StudentAcademicPrograms(models.Model):
student = models.ForeignKey(Students)
academic_program = models.ForeignKey(AcademicPrograms)
credits_completed = models.IntegerField()
academic_program_gpa = models.FloatField()
primary_program = models.BooleanField()
from studentapp.models import AcademicPrograms, AcademicProgramsManager, StudentAcademicPrograms
from studentapp.serializers import StudentAcademicProgramsSerializer, AcademicProgramsSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
class StudentAcademicProgramsList(APIView):
def get(self, request, format=None):
studentacademicprograms = StudentAcademicPrograms.objects.all()
serialized_studentacademicprograms = StudentAcademicProgramsSerializer(studentacademicprograms, many=True)
return Response(serialized_studentacademicprograms.data)
class StudentAcademicProgramsDetail(APIView):
def get_onjects(self, pk):
try:
return StudentAcademicPrograms.object.get(pk=pk)
except StudentAcademicPrograms.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
studentacademicprogram = self.get_object(pk)
serialized_studentacademicprogram = StudentAcademicProgramsSerializer(studentacademicprogram)
return Response(serialized_studentacademicprogram.data)
[
{
"credits_completed": 32,
"academic_program_gpa": 3.7,
"primary_program": true
},
{
"credits_completed": 32,
"academic_program_gpa": 3.4,
"primary_program": false
}
]
[
{
"pk": 1,
"fields": {
"academic_program": [
"acad_program_id": 124,
"program_title": "Associate in Arts Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": true,
"student": 1206,
"academic_program_gpa": 3.7
}
},
{
"pk": 2,
"fields": {
"academic_program": [
"acad_program_id": 123,
"program_title": "Associate in Sciences Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": false,
"student": 1206,
"academic_program_gpa": 3.4
}
}
]
当我在URL中调用我的StudentAcademicProgramsSerializer
时,我得到如下输出:
class AcademicProgramsManager(models.Manager):
def get_by_natural_key(self, acad_program_id, program_title, required_credits):
return self.get(acad_program_id = acad_program_id, program_title = program_title, required_credits = required_credits)
class AcademicPrograms(models.Model):
objects = AcademicProgramsManager()
acad_program_id = models.IntegerField(primary_key=True)
acad_program_category = models.ForeignKey(AcademicProgramCategories)
acad_program_type = models.ForeignKey(AcademicProgramTypes)
acad_program_code = models.CharField(max_length=25)
program_title = models.CharField(max_length=64)
required_credits = models.IntegerField()
min_gpa = models.FloatField()
description = models.CharField(max_length=1000)
def natural_key(self):
return (self.acad_program_id, self.program_title, self.required_credits)
class StudentAcademicPrograms(models.Model):
student = models.ForeignKey(Students)
academic_program = models.ForeignKey(AcademicPrograms)
credits_completed = models.IntegerField()
academic_program_gpa = models.FloatField()
primary_program = models.BooleanField()
from studentapp.models import AcademicPrograms, AcademicProgramsManager, StudentAcademicPrograms
from studentapp.serializers import StudentAcademicProgramsSerializer, AcademicProgramsSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
class StudentAcademicProgramsList(APIView):
def get(self, request, format=None):
studentacademicprograms = StudentAcademicPrograms.objects.all()
serialized_studentacademicprograms = StudentAcademicProgramsSerializer(studentacademicprograms, many=True)
return Response(serialized_studentacademicprograms.data)
class StudentAcademicProgramsDetail(APIView):
def get_onjects(self, pk):
try:
return StudentAcademicPrograms.object.get(pk=pk)
except StudentAcademicPrograms.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
studentacademicprogram = self.get_object(pk)
serialized_studentacademicprogram = StudentAcademicProgramsSerializer(studentacademicprogram)
return Response(serialized_studentacademicprogram.data)
[
{
"credits_completed": 32,
"academic_program_gpa": 3.7,
"primary_program": true
},
{
"credits_completed": 32,
"academic_program_gpa": 3.4,
"primary_program": false
}
]
[
{
"pk": 1,
"fields": {
"academic_program": [
"acad_program_id": 124,
"program_title": "Associate in Arts Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": true,
"student": 1206,
"academic_program_gpa": 3.7
}
},
{
"pk": 2,
"fields": {
"academic_program": [
"acad_program_id": 123,
"program_title": "Associate in Sciences Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": false,
"student": 1206,
"academic_program_gpa": 3.4
}
}
]
但我想要一个如下所示的输出:
class AcademicProgramsManager(models.Manager):
def get_by_natural_key(self, acad_program_id, program_title, required_credits):
return self.get(acad_program_id = acad_program_id, program_title = program_title, required_credits = required_credits)
class AcademicPrograms(models.Model):
objects = AcademicProgramsManager()
acad_program_id = models.IntegerField(primary_key=True)
acad_program_category = models.ForeignKey(AcademicProgramCategories)
acad_program_type = models.ForeignKey(AcademicProgramTypes)
acad_program_code = models.CharField(max_length=25)
program_title = models.CharField(max_length=64)
required_credits = models.IntegerField()
min_gpa = models.FloatField()
description = models.CharField(max_length=1000)
def natural_key(self):
return (self.acad_program_id, self.program_title, self.required_credits)
class StudentAcademicPrograms(models.Model):
student = models.ForeignKey(Students)
academic_program = models.ForeignKey(AcademicPrograms)
credits_completed = models.IntegerField()
academic_program_gpa = models.FloatField()
primary_program = models.BooleanField()
from studentapp.models import AcademicPrograms, AcademicProgramsManager, StudentAcademicPrograms
from studentapp.serializers import StudentAcademicProgramsSerializer, AcademicProgramsSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
class StudentAcademicProgramsList(APIView):
def get(self, request, format=None):
studentacademicprograms = StudentAcademicPrograms.objects.all()
serialized_studentacademicprograms = StudentAcademicProgramsSerializer(studentacademicprograms, many=True)
return Response(serialized_studentacademicprograms.data)
class StudentAcademicProgramsDetail(APIView):
def get_onjects(self, pk):
try:
return StudentAcademicPrograms.object.get(pk=pk)
except StudentAcademicPrograms.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
studentacademicprogram = self.get_object(pk)
serialized_studentacademicprogram = StudentAcademicProgramsSerializer(studentacademicprogram)
return Response(serialized_studentacademicprogram.data)
[
{
"credits_completed": 32,
"academic_program_gpa": 3.7,
"primary_program": true
},
{
"credits_completed": 32,
"academic_program_gpa": 3.4,
"primary_program": false
}
]
[
{
"pk": 1,
"fields": {
"academic_program": [
"acad_program_id": 124,
"program_title": "Associate in Arts Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": true,
"student": 1206,
"academic_program_gpa": 3.7
}
},
{
"pk": 2,
"fields": {
"academic_program": [
"acad_program_id": 123,
"program_title": "Associate in Sciences Degree",
"required_credits": 60
],
"credits_completed": 32,
"primary_program": false,
"student": 1206,
"academic_program_gpa": 3.4
}
}
]
如何实现它?只需在
学生学术程序序列化程序中使用序列化程序字段即可:
class AcademicProgramsSerializer(serializers.ModelSerializer):
class Meta:
model = AcademicPrograms
depth = 1
class StudentAcademicProgramsSerializer(serializers.ModelSerializer):
academic_program = AcademicProgramsSerializer(source='academic_program')
class Meta:
model = StudentAcademicPrograms
fields = (
'credits_completed',
'academic_program_gpa',
'primary_program',
'academic_program'
)
不会使用Serializer.modelsserializer
,而是更耗时和手工制作的Serializer.Serializer
。我收到一个未定义的“AcademicProgramsSerializer”错误。还有什么遗漏吗?对不起,你需要在这个之前移动那个序列化程序…我会更新答案没有问题,Django REST框架真的很棒,玩得开心!如果遇到更多的麻烦,我会告诉你;-)嗨,你能帮我回答这个问题吗?