2016-07-28 4 views
3

私たちは、このスタックでモバイルWebアプリケーションを作成している:Django RESTフレームワークでモデル/シリアライザを正しく定義する方法は?

をPythonの Djangoは、SQLiteのDB ジャンゴ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を継承しているため、URLが届きます。

class QuestionSerializer(serializers.HyperlinkedModelSerializer): 
    ... 

あなたがそれらをしたくない場合は、別の基本クラスを使用する - おそらくちょうどModelSerializer

+0

ありがとうございます!私はModelSerializerを使用し、それは最終的に働いた。 'クラスAnswerSerializer(serializers.ModelSerializer): クラスのMeta: モデル=( 'テキスト') フィールド=回答 クラスQuestionSerializer(serializers.ModelSerializer): クラスのMeta: モデル=質問 フィールド=( 'question'、 'answers'、 'correct') read_only_fields =( 'answers'、) 深さ= 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フィールドを挿入します。

関連する問題