【问题标题】:How can I get the custom nested data in Django?如何在 Django 中获取自定义嵌套数据?
【发布时间】:2017-12-26 11:03:36
【问题描述】:

我有四个模型如下:

class AModel(models.Model):
    name = models.CharField(max_length=11)

class BModel(models.Model):
    name = models.CharField(max_length=11)
    a = models.ForeignKey(AModel, related_name="bs")

class CModel(models.Model):
    name = models.CharField(max_length=11)
    b = models.ForeignKey(BModel, related_name="cs")

class DModel(model.Model):
    name = models.CharField(max_length=11)
    c = models.ForeignKey(CModel, related_name="ds")

现在我想获取以下数据:

[
    {"name":"a1",
     "value":1,
     "image":"xxxxx.png",
     "children":[
        {"name":"b1",
         "value":1,
         "image":"xxxxx.png",
         "children":[
             {"name":"c1",
              "value":1,
              "image":"xxxx.png",
              "children":[
                   {"name":"d1",
                    "value":1,
                     "image":"xxxx.png",
                   }
               ]
             }
         ]
        }
     ]
    }
]

注意,valueimage 键值是我自己添加的。 我知道使用 Django-Rest-Framework 可以获得如下数据:

[
    {  
      "id":1,
      "name":"a1",
      "bs":[
          {
           "id":1,
           "name":"b1",
           "cs":[
               "id":1,
               "name":"c1",
               "ds":[
                    {
                        "id":1,
                        "name":"d1",
                    }
                ]
            ]
         }
      ]
    }
]

但是我怎样才能得到我的需求数据呢?

我也试过先查询AModel实例,forloop查询AModel实例的bs,然后再做next,但我觉得太复杂了,不是一个简单方便的获取方式。

【问题讨论】:

    标签: python django algorithm


    【解决方案1】:

    不是实际代码而是伪代码会给你这个想法。

    data_of_C_in_D = D.C_set # gives all value of C in D
    Data_of_B_in_C = for i in data_of_C_in_D:
                         B.i_set #gives all value of C in B
    

    ....

    类似地,您可以从 D --> A 出发,方法是对它们中的每一个进行集合,然后对它们进行迭代。点击这里了解更多

    Django reverse lookup of foreign keys

    称为外键反向查找

    【讨论】:

    • 但是有一个 EModel 怎么样?我不认为 x_set 对帖子有帮助。
    • 您必须从 D 中的所有 C 项返回到 A,然后从 C 中的 B 项,然后从 A 到 B。您是否检查了答案中的链接,它会对您有所帮助。
    • 抱歉,当您进行第一次查询时,我触发了错误的查询,它将返回所有可能性的集合。然后在另一个模型中逐个迭代
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多