2016-07-28 5 views
3

Wir sind mit diesem Stapel eine mobile Web-Anwendung zu erstellen:Wie definiere ich Modelle/Serializer richtig für Django REST Framework?

Python Django, SQLite DB Django REST Ionic Cordova Angular JS

Dies ist ein Quiz-Anwendung, in der Sie Fragen aus 4 Mehr beantworten Entscheidungen. Fragen und Antworten sind in der Datenbank gespeichert. Mit Hilfe des REST-Frameworks wurde ein Endpunkt erstellt.

Mit dieser JSON-Datei arbeitet unser Angular JS-Controller asynchron. Das Problem besteht darin, Antworten in model.py zu definieren. Es handelt sich um ein Array in einem Array.

Wir versuchen, diese Struktur mit Django REST zu erhalten:

[ 
    { 
     "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 
    }, 
] 

Und das ist, was wir haben:

[ 
    { 
     "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 
    } 
] 

Hier ist unsere 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() 

Serialisierer:

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 

Ist es irgendwie möglich, die URLs in unserer Lösung zu entfernen?

Antwort

2

Die URLs kommen, weil Sie HyperlinkedModelSerializer erben.

class QuestionSerializer(serializers.HyperlinkedModelSerializer): 
    ... 

Wenn Sie sie nicht wollen, verwenden Sie eine andere Basisklasse - vielleicht nur ein ModelSerializer.

+0

Danke! Ich habe den ModelSerializer benutzt und es hat endlich funktioniert. 'Klasse AnswerSerializer (serializers.ModelSerializer): Meta-Klasse: Modell = Antwort Felder = ('text') Klasse QuestionSerializer (serializers.ModelSerializer): Klasse Meta: Modell = Frage Felder = ('Frage', 'Antworten', 'richtig') read_only_fields = ('Antworten',) Tiefe = 1' Ich musste auch die benutzerdefinierte ID entfernen, da die IDs automatisch gesetzt wurden – Vietosan

2

Ich glaube, das wird funktionieren.

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 

Sie müssen möglicherweise die source ändern richtig die Antworten, die Sie brauchen.

Die serializers.HyperlinkedModelSerializer fügt das URL-Feld automatisch in Ihre Antwort ein.