DRF:串行器或视图中的数据结构?

时间:2017-03-24 15:24:43

标签: python django django-rest-framework

鉴于下面的模型,我一直试图找出如何使用Django REST Framework返回我想到的数据结构(也在下面)。

如何在序列化程序中实现,或者是否需要使用传统的Django样式查询在视图中构建这样的数据结构?

关于

基本上,创建一个单词,用户提交该单词的定义,并对每个定义进行投票(最有趣,最悲伤,最重要的等等)

models.py

from django.db import models


class Word(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    word = models.CharField()
    timestamp = models.DateTimeField()


class Definition(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    word = models.ForeignKey(Word, on_delete=models.CASCADE)
    definition = models.CharField()
    timestamp = models.DateTimeField()


class Vote_category(models.Model):
    category = models.CharField()


class Vote_history(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    definition = models.ForeignKey(Definition, on_delete=models.CASCADE)
    timestamp = models.DateTimeField()
    vote = models.ForeignKey(Vote_category, on_delete=models.CASCADE)

预期的查询结果结构

word: 'hello',
definitions: [
    {
        user: 'alice',
        definition: 'an expression of greeting',
        votes: {
            funny: 3,
            sad: 1,
            wtf: 7
        },
        votes_total: 11
    },
    etc...
]

谢谢!

1 个答案:

答案 0 :(得分:1)

您附加的模式可以(并且应该)使用Django REST Framework Serializers生成;可以使用嵌套序列化程序生成架构的嵌套元素。通常,这些序列化程序将继承自ModelSerializer

以下是您将用于开始构建架构的嵌套序列化程序的示例:

class WordSerializer(serializers.ModelSerializer):
    """Serializer for a Word"""
    definitions = DefinitionSerializer(many=True)

    class Meta:
        model = Word
        fields = ('word', 'definitions')

class DefinitionSerializer(serializers.ModelSerializer):
    """Serializer for a Definition"""
    user = UserSerializer(read_only=True)
    votes = VoteSerializer(many=True)

    class Meta:
        model = Word
        fields = ('definition', 'user', 'votes')

您列出的可能更复杂的架构的一部分是投票类别的投票类别地图。 DRF自然会创建一个结构,它是一个对象列表,而不是您的模式所具有的单个对象。要覆盖该行为,您可以查看creating a custom ListSerializer