2016-07-28 2 views
3

우리는이 스택과 함께 모바일 웹 응용 프로그램을 만드는 :Django REST Framework에서 모델/시리얼 라이저를 올바르게 정의하는 방법은 무엇입니까?

파이썬을 장고, SQLite는 DB 장고 REST 이온 코르도바 각도 JS

이 당신이 4 여러 질문에 대답하는 퀴즈 응용 프로그램입니다 선택. 질의 응답은 데이터베이스에 저장됩니다. REST 프레임 워크의 도움으로 엔드 포인트가 작성되었습니다.

이 JSON 파일을 사용하면 Angular JS 컨트롤러가 비동기 적으로 작동합니다. 문제는 model.py에서 답을 정의하는 것입니다. 배열에 배열이 포함됩니다.

우리는 장고 REST이 구조에 도착해야 해요

[ 
    { 
     "question" : "Java was originally developed at _______________", 
     "answer" : [ 
     {"id" : 0, "text" : "Sun Microsystems"}, 
     {"id" : 1, "text" : "Intel"}, 
     {"id" : 2, "text" : "Hewlett-Packard"}, 
     {"id" : 3, "text" : "Oracle"} 
     ], 
     "correct" : 0 
    }, 
] 

을 그리고 이것은 우리가 무엇을 :

from django.db import models 

class Answer(models.Model): 
    answerid = models.IntegerField() 
    text = models.TextField() 

class Question(models.Model): 
    question = models.CharField(max_length=200) 
    answer = models.ManyToManyField(Answer) 
    correct = models.IntegerField() 

:

여기
[ 
    { 
     "question": "Java was originally developed at _______________", 
     "answer": [ 
      { 
       "url": "http://127.0.0.1:8000/api/answer/1/", 
       "answerid": 0, 
       "text": "Sun Microsystems" 
      }, 
      { 
       "url": "http://127.0.0.1:8000/api/answer/2/", 
       "answerid": 1, 
       "text": "Intel" 
      }, 
      { 
       "url": "http://127.0.0.1:8000/api/answer/3/", 
       "answerid": 2, 
       "text": "Hewlett-Packard" 
      }, 
      { 
       "url": "http://127.0.0.1:8000/api/answer/4/", 
       "answerid": 3, 
       "text": "Oracle" 
      } 
     ], 
     "correct": 0 
    } 
] 

우리 models.py입니다 시리얼 라이저 :

from quiz.models import Question, Answer 
from rest_framework import routers, serializers, viewsets 

class AnswerSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Answer 
     fields = ('answerid', 'text') 

class QuestionSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Question 
     fields = ('question', 'answer', 'correct') 
     read_only_fields = ('answer',) 
     depth = 1 

# ViewSets define the view behavior. 
class QuestionViewSet(viewsets.ModelViewSet): 
    queryset = Question.objects.all() 
    serializer_class = QuestionSerializer 

class AnswerViewSet(viewsets.ModelViewSet): 
    queryset = Answer.objects.all() 
    serializer_class = AnswerSerializer 

Google 솔루션에서 URL을 제거하는 것이 가능합니까?

답변

2

당신이 상속했기 때문에 URL은 HyperlinkedModelSerializer입니다. 당신이 그들을 원하지 않는 경우

class QuestionSerializer(serializers.HyperlinkedModelSerializer): 
    ... 

, 다른 기본 클래스를 사용 - 아마도 단지 ModelSerializer.

+0

감사! ModelSerializer를 사용하여 마침내 효과가있었습니다. '클래스 AnswerSerializer (serializers.ModelSerializer) : 클래스 메타 : 모델 = ('텍스트') 필드 = 대답 클래스 QuestionSerializer (serializers.ModelSerializer) : 클래스 메타 : 모델 = 질문 필드 = ('question', 'answers', 'correct') read_only_fields = ('answers',) depth = 1' ID가 자동으로 설정 되었기 때문에 맞춤 ID를 삭제해야했습니다. – Vietosan

2

나는 이것이 효과가있을 것이라고 믿는다.

class AnswerSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Answer 
     fields = ('answerid', 'text') 

class QuestionSerializer(serializers.ModelSerializer): 

answer = AnswerSerializer(source="answers) 
class Meta: 
    model = Question 
    fields = ('question', 'answer', 'correct') 
    read_only_fields = ('answer',) 
    depth = 1 

당신은 정확하게 당신이 필요로하는 답을 얻기 위해 source을 변경해야 할 수 있습니다.

serializers.HyperlinkedModelSerializer은 자동으로 응답에 url 필드를 삽입합니다.

관련 문제