【问题标题】:How to implement nested queryset in Django ORM?如何在 Django ORM 中实现嵌套查询集?
【发布时间】:2019-08-07 12:28:50
【问题描述】:

我正在从 django rest 框架构建 API。我有一个模型,其中有某些外键。对于该模型列表,我正在使用 ListAPIView。在该清单中,我想实现嵌套查询集。外键模型彼此之间没有直接关系。 在下面的例子中。 对于多个 x 可以有多个 y 对于多个 y,可以有多个 z。 所以我想要 json 响应作为唯一 x 并且在该对象中它的 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":
                                         }
                                },
                       },
                ]
}

【问题讨论】:

    标签: python django django-rest-framework django-orm django-serializer


    【解决方案1】:

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

    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 进行列表。 如果这能解决您的问题,请告诉我们。

    【讨论】:

    • 一开始我也是这么想的。但这只有在 yModel 是 xModel 中的外键时才能做到,对于 yModel 和 zModel 依此类推。对我来说,情况并非如此。 yModel 和 xModel 没有关系。那么在这种情况下可以做些什么呢?并感谢您提供详细信息。
    • 能否请您发布您的模型。
    • 从你发布的模型中,我无法猜出 x 和 y 是如何相关的。 y 模型中没有定义其与 x 关系的字段。在这种情况下,我们不能将 y 与 x 嵌套等等。如果不是这种情况,我们是否在模型中遗漏了什么?
    • 这正是我的情况! y 模型中没有定义其与 x 关系的字段。我仍然想做嵌套!我可以这样做吗?有什么解决方法吗?
    • 我不知道解决方法,我认为该模型结构不可能。对于您想要的输出类型,您需要在模型中具有外键关系。
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2017-03-21
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多