繁体   English   中英

如何在Django ORM中实现嵌套查询集?

[英]How to implement nested queryset in Django ORM?

我正在从django rest框架构建API。 我有一个模型,其中有某些外键。 对于该模型清单,我正在使用ListAPIView。 在该清单中,我想实现嵌套的查询集。 外键模型之间没有直接关系。 在下面的示例中。 对于多个x,可以有多个y,对于多个y,可以具有多个z。 所以我想要唯一的x的json响应,并在该对象中的y和z。

我尝试使用注释和子查询。 但这似乎并不能解决我的问题。

Table: 
|x_id | y_id | z_id |
|1    | 2    | 3    |
|1    | 4    | 5    |
|1    | 2    | 6    | 
class Workitem(models.Model):
{ 
  x_id = # foreign key
  y_id = # foreign key
  z_id = # foreign key
}
class x(models.Model):
{ 
  x_id = 
  x_name = 
  x_details = 
}
class y(models.Model):
{ 
  y_id = 
  y_unique_name = 
  y_task_details = 
}
class z(models.Model):
{ 
  z_id = 
  z_acc_name = 
  z_acc_details = 
}
class WorkitemSerializer(serializers.ModelSerializer)
    class Meta:
            model = Workitem
            fields = '__all__'
            depth=2

当前我正在获取JSON响应

{
    "count": 1,
    "next": null,
    "previous": null,
    "results":
       [
        { "x_id": {"x_details"},
          "y_id": {"y_details"},
          "z_id": {"z_details"}
        }
       ]
}

我想要回应

{
    "count": 1,
    "next": null,
    "previous": null,
     results: ["x_id":{
                       "x_details":
                        "y_id": {
                                 "y_details":
                                 "z_id": {
                                         "z_details":
                                         }
                                },
                       },
                ]
}

对于这种响应,您需要将序列化器链接起来

from rest_framework import serializers
class zserializer(serializers.ModelSerializer)

      class Meta:
          model = zModel
          fields = '__all__'

class yserializer(serializers.ModelSerializer)
      zobjects = zserializer(many=True)
      class Meta:
          model = yModel
          fields = ('id', 'zobjects')


class xserializer(serializers.ModelSerializer)
      yobjects = yserializer(many=True)
      class Meta:
          model = xModel
          fields = ('id', 'yobjects')

然后在视图中使用xserializer列出。 让我们知道这是否可以解决您的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM