从多对一关系序列化嵌套查询集

时间:2017-02-06 21:01:24

标签: django postgresql serialization orm django-queryset

我有一个调查应用程序,其中有问题的调查,问题和选择。每个问题都有一个外键给它所属的调查,并且每个选项都有一个外键给问题属于。 清除多项选择题的模型代码如下所示。

class Survey(models.Model):
    # survey attributes, not needed in the query for this question 

class Question(models.Model):
    survey = models.ForeignKey(Survey)
    prompt = models.TextField()

class Choice(models.Model):
    question = models.ForeignKey(Question)
    letter = models.CharField(max_length=1)
    text = models.TextField()
    is_correct = models.BooleanField(default=False)

为了获得调查中的所有问题,我可以选择所需的所有数据以及向后关系,

Survey.objects.get(pk=1).question_set\
.select_related('choice__text', 'choice__letter')\
.values('prompt', 'choice__text', 'choice__letter')

它将按预期返回

[{
    prompt: str, 
    choice__text: str,
    choice__letter: char, 
},]    

...但是这会在每一行中复制提示,理想情况下格式更接近

[{
    prompt: str,
    choice_set: [{
        letter: char,
        text: str,
    },]
},]

我之前通过将它扔进熊猫数据框并在序列化之前对数据进行分组来解决类似的问题,但我只能假设django的创建者想办法做到这一点

有没有办法轻松嵌套这些查询而不循环遍历每个问题模型并查询其选择?

1 个答案:

答案 0 :(得分:0)

使用django-rest-framework中的Serializer应该可以解决问题。序列化程序可以像“#34;嵌套关系"”部分中的示例一样嵌套。在http://www.tomchristie.com/rest-framework-2-docs/api-guide/relations