【问题标题】:How to three-level query in Django?如何在 Django 中进行三级查询?
【发布时间】:2018-04-06 14:14:04
【问题描述】:

我有三个表,名字ABC

class A(models.Model):
    name = models.CharField(max_length=12)

class B(models.Model):
    name = models.CharField(max_length=12)
    a = models.ForeignKey(to=A)

class C(models.Model):
    name = models.CharField(max_length=12)
    email = models.EmailField()
    b = models.ForeignKey(to=B)

我想得到以下数据:

[
    {"name":"a1",
     "data":[{
        "name":"b1",
        "data":[
           {"name":"c1",
           "data":{"c1_name":"c1_name", "c1_id":"c1_id"}
           },
           {"name":"c2",
           "data":{"c2_name":"c2_name", "c2_id":"c2_id"}
           }
        ] 
     },
    {
        "name":"b2",
        "data":[
           {"name":"c1",
           "data":{"c1_name":"c1_name", "c1_id":"c1_id"}
           },
           {"name":"c2",
           "data":{"c2_name":"c2_name", "c2_id":"c2_id"}
           }
          ] 
          }
        ]
    }
]

你看,有三级数据,如果只有表A和B,我可以多表连接查询:

B.objects.filter(a='search_id')

但是现在有三个表,并且您看到表C的电子邮件不包含在查询数据中。 如何在我的场景中实现这一要求?

【问题讨论】:

标签: python django


【解决方案1】:

正如@Brian H. 在 cmets 中指出的那样,您可以使用 __ 链接外键。

在你的情况下,你可以得到数据

C.objects.filter(b__a='search_id').values('id', 'name', 'b__name', 'b__a__name')

然后您可以遍历数据并以您需要的格式构建列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2012-01-23
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多