2016-07-28 56 views
3

我們正在創造這個堆棧中的移動Web應用程序:如何正確定義Django REST框架的模型/序列化程序?

的Python Django的,SQLite的DB Django的REST 離子科爾多瓦 角JS

這是一個測驗的應用程序,在你回答4多個問題選擇。問題和答案存儲在數據庫中。在REST框架的幫助下,已經創建了一個端點。

有了這個JSON文件,我們的Angular JS控制器異步工作。 問題是在model.py中定義答案。它涉及一個數組中的數組。

我們正在試圖讓這個結構Django的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 
    }, 
] 

這是我們所擁有的:

[ 
    { 
     "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 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() 

序列化器:

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 

是否有可能刪除我們的解決方案中的URL?

回答

2

這個網址是因爲你繼承了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字段。

相關問題