2015-12-07 55 views
2

我有两个模型,SurveyQuestion。 A Survey可以包含多个Question。我想创建一个ListAPIView以返回与Questions关联的Surveys列表。所以返回的JSON是这样的:Django Rest Framework如何自定义ListAPIView

[{ 
    'name': 'Survey 1', 
    'questions':[{'question': 'q1'}, {'question': 'q2'}] 
}, 
{ 
    'name': 'Survey 2', 
    'questions':[{'question': 'q3'}, {'question': 'q4'}] 
}, 
... 
] 

我想使用自带的DRF包CursorPagination。所以这是我曾尝试:

class SurveyList(ListAPIView): 
    pagination_class = CursorPagination 

    def get_queryset(self): 
     # How can I construct a queryset that matches the JSON structure above? 

由于ListAPIView的get_queryset预计要返回一个QuerySet。我需要手动创建上述的JSON结构并将其放入一个查询集。

所以我的问题是如何手动创建一个查询集?


更新:这里是模型定义

class Survey(models.Model): 
    name = models.TextField() 

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

回答

2

您需要创建自定义序列化的模型:

class QuestionSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Question 
     fields = ('question',) 

class SurveySerializer(serializers.ModelSerializer): 
    questions = QuestionSerializer(source="question_set", many=True) 

    class Meta: 
     model = Survey 
     fields = ('name', 'questions') 
     depth = 1 

在你看来:

class SurveyList(ListAPIView): 
    queryset = Survey.objects.all() 
    serializer_class = SurveySerializer 

在如果你有ForeignKeyQuestion在您的Survey模型。如果您没有用您的字段名称替换question_set

结帐serializers section在django rest框架文档中。

+0

嗨Daniil,这绝对看起来很有希望。我已经更新了模型定义。我想知道是否需要'source = question_set'和'depth = 1'部分。 – Cheng

+0

'深度= 1'意味着序列化程序将更深入地发现你的关系(我不记得它是否有默认值)。 'question_set'是必需的,因为与'Questions'的关系在技术上超出了你的模型(默认情况下,Django REST框架会试图序列化你在你的模型中定义的那些字段) –

+0

嗨Daniil,我阅读了文档,但找不到解释关于'question_set'。对于格式'?_set',部分必须匹配模型的名称? – Cheng

相关问题