Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django rest框架序列化错误_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django rest框架序列化错误

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

我有一个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_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 AcademicProgramsList(APIView):
    def get(self, request, format=None):
        academicprograms = AcademicPrograms.objects.all()
        serialized_academicprograms = AcademicProgramsSerializer(academicprograms, many=True)
        return Response(serialized_academicprograms.data)

class AcademicProgramsDetail(APIView):

    def get_onjects(self, pk):
        try:
            return AcademicPrograms.object.get(pk=pk)
        except AcademicPrograms.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        academicprogram = self.get_object(pk)
        serialized_academicprogram = AcademicProgramsSerializer(academicprogram)
        return Response(serialized_academicprogram.data)
这是我的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 AcademicProgramsList(APIView):
    def get(self, request, format=None):
        academicprograms = AcademicPrograms.objects.all()
        serialized_academicprograms = AcademicProgramsSerializer(academicprograms, many=True)
        return Response(serialized_academicprograms.data)

class AcademicProgramsDetail(APIView):

    def get_onjects(self, pk):
        try:
            return AcademicPrograms.object.get(pk=pk)
        except AcademicPrograms.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        academicprogram = self.get_object(pk)
        serialized_academicprogram = AcademicProgramsSerializer(academicprogram)
        return Response(serialized_academicprogram.data)
最后是我的网址:

from django.conf.urls import patterns, include, url
from rest_framework.urlpatterns import format_suffix_patterns
from studentapp import api

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'texascompletes.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    #API:
    url(r'^api/studentacademicprograms/$', api.AcademicProgramsList.as_view()),
    url(r'^api/studentacademicprograms/(?P<pk>[0-9]+)/$', api.AcademicProgramsDetail.as_view()),

    url(r'^admin/', include(admin.site.urls)),
)

urlpatterns = format_suffix_patterns(urlpatterns)

哪里出错了?

尝试将
源设置为模型上的属性/方法名称。例如:

studentacademicprograms = StudentAcademicProgramsSerializer(
    many=True, 
    source='studentacademicprograms_set')

中给出的示例在模型上设置了与序列化程序中的属性名称匹配的相关名称(默认值)。如果名称不匹配,则需要指定要使用的模型的源方法/属性。

我不熟悉django rest framework
,但是从它的文档来看,在我看来,你不应该在
AcademicProgramsSerializer.Meta.fields
列表中包含
studentacademicprograms
——该字段列表只指定要序列化的模型的实际字段,但是
studentacademicprograms
不是您的
AcademicPrograms
模型上的字段。我遵循了此文档中的嵌套关系。甚至他们也用同样的方法,这让我很困惑。他们的示例不适合您的场景-他们的模型实际上包含他们为序列化设置的字段。好的..我完全是新手,所以我遵循了文档。你能给我一个更好的方法来定义我的序列化程序吗?嗨,谢谢你的回复。我不确定我是否理解正确。您想让我在哪里添加它?更改
AcademicProgramsSerializer
中与上面添加
源代码相匹配的行。您还应该从
字段中删除'studentacademicprograms',因为它不是必需的(您已经使用属性指定了它的序列化),并且它应该匹配反向关系的名称,即
studentacademicprograms\u set