2016-07-28 4 views
3

Мы создаем мобильные веб-приложение с помощью этого пакета:Как правильно определить модели/сериализаторы для Django REST Framework?

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

URL-адреса поступают потому, что вы наследуете HyperlinkedModelSerializer.

class QuestionSerializer(serializers.HyperlinkedModelSerializer): 
    ... 

Если вы не хотите их использовать другой базовый класс - возможно, просто ModelSerializer.

+0

Спасибо! Я использовал ModelSerializer и, наконец, работал. класс 'AnswerSerializer (serializers.ModelSerializer): класс Meta: модель = Ответ поля = ('текст') класс QuestionSerializer (serializers.ModelSerializer): класс Meta: модель = Вопрос поля = («вопрос», «ответы», «правильный») read_only_fields = ('отвечает',) depth = 1' Мне также пришлось удалить пользовательский идентификатор, поскольку идентификаторы были установлены автоматически – 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 в ваш ответ.

Смежные вопросы