【问题标题】:How to define models/serializers correctly for Django REST Framework?如何为 Django REST Framework 正确定义模型/序列化器?
【发布时间】:2016-12-03 05:56:56
【问题描述】:

我们正在使用此堆栈创建一个移动 Web 应用程序:

Python Django,SQLite 数据库 Django 休息 离子科尔多瓦 角度 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

是否有可能在我们的解决方案中删除网址?

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案1】:

    urls 是因为你继承了HyperlinkedModelSerializer

    class QuestionSerializer(serializers.HyperlinkedModelSerializer):
        ...
    

    如果您不想要它们,请使用不同的基类 - 可能只是 ModelSerializer

    【讨论】:

    • 谢谢!我使用了 ModelSerializer,它终于奏效了。 class AnswerSerializer(serializers.ModelSerializer): class Meta: model = Answer fields = ('text') class QuestionSerializer(serializers.ModelSerializer): class Meta: model = Question fields = ('question', 'answers', 'correct') read_only_fields = ('answers',) depth = 1我还必须删除自定义 ID,因为 ID 是自动设置的
    【解决方案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 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2018-06-07
      • 2019-06-02
      • 2018-11-21
      相关资源
      最近更新 更多