【问题标题】:Group by and nesting result in Django Rest FrameworkDjango Rest Framework中的分组和嵌套结果
【发布时间】:2021-12-16 10:43:45
【问题描述】:

我在 API 中工作,我想按 id DESC 排序,但我也想按 client_id 分组,所以我可以将来自同一客户的所有问题都排序,嵌套结果:

这是我的代码:

models.py

class QuestionsModel(models.Model):
    id = models.IntegerField()
    publication_id = models.IntegerField(blank=True, null=True)
    publication_title = models.CharField(max_length=255)
    publication_link = models.CharField(max_length=255)
    question = models.CharField(max_length=255)
    member_id = models.IntegerField()
    client_id = models.IntegerField()

   class Meta:
        managed = False
        db_table = 'questions'

序列化器.py

class QuestionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = QuestionsModel
        fields = '__all__'

views.py

class QuestionsAPIView(generics.ListAPIView):
    def get_queryset(self):
        queryset = ''
        member_id = self.request.query_params.get('member_id')
        
        if member_id is not None and member_id.isnumeric():
            queryset = QuestionsModel.objects.filter(member_id=member_id).order_by('-id')
        return queryset

结果:

    {
    "id": 848484,
    "publication_id": 4444,
    "publication_title": "Title publication",
    "publication_link": "Link",
    "question": "This is a test question",
    "member_id": 123456,
    "client_id": 500
    }

我想要什么:按 client_id 分组问题,所以希望输出 JSON 可能是:

{
"client_id": 500,
"question" : [
    "id": 848484,
    "publication_id": 4444,
    "publication_title": "Title publication",
    "publication_link": "Link",
    "question": "This is a test question",
    "member_id": 123456,
    "client_id": 500
 ],
[
    "id": 848485,
    "publication_id": 4445,
    "publication_title": "Title publication",
    "publication_link": "Link",
    "question": "This is a test question",
    "member_id": 123456,
    "client_id": 500
]
}

注意:我使用 SQL Server 作为数据库引擎。

【问题讨论】:

    标签: python sql django django-rest-framework nested


    【解决方案1】:

    如果客户和问题之间存在“一对多”关系,我建议创建一个客户模型并在问题与其客户之间建立外键关系。然后,您可以更轻松地利用 DRF 的模型序列化程序和嵌套关系。

    https://www.django-rest-framework.org/api-guide/relations/#nested-relationships

    这是我认为您正在努力实现的简化版本:

    models.py

    class Client(models.Model):
        id = models.IntegerField(primary_key=True)
    
    class Question(models.Model):
        id = models.IntegerField(primary_key=True)
        question = models.CharField(max_length=255)
        client_id = models.ForeignKey(to=Client,on_delete=models.CASCADE,related_name='questions')
    

    序列化器.py

    class QuestionSerializer(serializers.ModelSerializer):
        class Meta:
            model = Question
            fields = ['id','question']
    
    
    class ClientSerializer(serializers.ModelSerializer):
        questions = QuestionSerializer(many=True, read_only=True)
    
        class Meta:
            model = Client
            fields = ['id','questions']
    
    

    views.py

    class ClientList(generics.ListAPIView):
        queryset = Client.objects.all()
        serializer_class = ClientSerializer
    

    如果我将此视图连接到一个 URL 并对其调用 GET,则生成的数据结构是:

    [
        {
            "id": 1,
            "questions": [
                {
                    "id": 1,
                    "question": "questions 1"
                },
                {
                    "id": 2,
                    "question": "questions2"
                },
                {
                    "id": 3,
                    "question": "questions3"
                }
            ]
        }
    ]
    

    我不确定你打算让谁使用你的 API,但作为一个经常使用 REST 的人,这个数据结构对我来说比你建议的更直观。这是一个客户对象列表(尽管在此示例中只包含一个),下面有一个嵌套的问题对象列表。根据需要扩展您的模型并优化您的查询集!

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多