【问题标题】:DRF: data structure in serializer or view?DRF:序列化程序或视图中的数据结构?
【发布时间】:2017-03-24 15:24:43
【问题描述】:

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

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

关于

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

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...
]

谢谢!

【问题讨论】:

  • 定义应该是list 而不是dict,不是吗?
  • @Michael:很好。我更新了示例。

标签: python django django-rest-framework


【解决方案1】:

您附加的架构可以(并且应该)使用 Django REST 框架序列化程序生成;可以使用嵌套序列化程序生成架构的嵌套元素。通常,这些序列化程序将从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

【讨论】:

  • 谢谢。事实上,投票类别到投票计数的地图是最复杂的部分。我工作的其他一切。欢迎帮助。
  • 如果不完全需要将其编码为单个 JSON object,您可以将其表示为 objects 的列表,其中一个属性表示投票类型(即 funny , sad 等)和另一个表示计数的属性。那是我对同样问题的解决方案。如果答案解决了您的问题,您可以接受它,以便其他人知道您的问题已得到解答。希望对您有所帮助!
猜你喜欢
  • 2020-12-17
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多