Skip to main content
 首页 » 编程设计

python之Django Rest Framework如何自定义ListAPIView

2024年08月23日30dflying

我有两个模型,Survey 和 Question。一个 Survey 可以包含多个 Question。我想创建一个 ListAPIView 以返回一个 Surveys 列表,其中包含与之关联的 Questions。所以返回的 json 看起来像这样:

[{ 
     '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 需要返回一个查询集。我需要手动创建上述 JSON 结构并将其放入查询集中。

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


更新:这里是模型定义

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

请您参考如下方法:

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

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 

如果您在 Survey 模型中有 ForeignKey 到 Question。如果您不将 question_set 替换为您的字段名称。

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