鉴于下面的模型,我一直试图找出如何使用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...
]
谢谢!
答案 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。