2014-04-26 3 views
0

나머지 프레임 워크 직렬화 :장고 나는이처럼 보이는 장고 모델이 오류

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 파일은 다음과 같습니다 :

이 내 serializers.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) 

그리고 마지막으로 내 URL을 :

난 내 API를 줄 때

나는 어디에서 잘못 가고

'AcademicPrograms' object has no attribute 'studentacademicprograms' 

studentacademicprograms/다음과 같은 오류는 무엇입니까?

+0

'장고 - 나머지 프레임 워크'에 익숙하지 않지만 그 문서를 보면'AcademicProgramsSerializer.Meta.fields' 목록에'studentacademicprograms'을 포함해서는 안된다 - 그 필드 목록 만 serialize 할 모델의 실제 필드를 지정하지만'studentacademicprograms'는'AcademicPrograms' 모델의 필드가 아닙니다. – lanzz

+0

이 문서의 중첩 된 관계를 따르고있었습니다. 심지어 그들은 나를 혼란스럽게했던 것과 같은 방식으로 사용했습니다. http://www.django-rest-framework.org/api-guide/relations – Abhishek

+0

예제가 시나리오에 맞지 않습니다. 모델에 실제로 직렬화를 위해 설정 한 필드가 있습니다. – lanzz

답변

1

source을 모델의 속성/메소드 이름으로 설정해보십시오. 예를 들어 :

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

Django Rest Framework Serializer relations docs에 주어진 예는 시리얼 라이저 (기본값)에서 속성 이름과 일치하는 모델에 관련된 이름을 설정합니다. 이름이 일치하지 않으면 사용하려는 모델의 소스 메소드/속성을 지정해야합니다.

+0

안녕하십니까. 감사합니다. 내가 너에게 옳은지 모르겠다. 정확히 어디에서 추가할까요? – Abhishek

+0

'AcademicProgramsSerializer'에서'source'를 추가하는 것과 일치하는 줄을 변경하십시오. 또한 'fields'에서 'studentacademicprograms'을 제거해야합니다 (속성을 사용하여 직렬화를 지정 했으므로 필요하지 않음). 역 관계의 이름 인 'studentacademicprograms_set'과 일치해야합니다. – AndrewS

관련 문제