Django反向外键过滤器

时间:2018-09-13 00:12:11

标签: python django

我有一个不正常的情况,但是由于我是这个充满Django的世界的新手,所以我可能是错的。

# Create your models here.
class Country(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=2, default="US")

    def __str__(self):
        return self.name

class State(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=2, default="ME")

    country = models.ForeignKey(Country, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class City(models.Model):
    name = models.CharField(max_length=100)
    state = models.ForeignKey(State, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class ProjectSite(models.Model):
    name = models.CharField(max_length=100)
    city = models.ForeignKey(City, on_delete=models.PROTECT)

    def __str__(self):
        return self.name

以上是应用程序模型的子集。当我创建所有“ ProjectSites”的列表时,我想按Country-State-City对其进行排序,最好以一种提前的方式进行分类,以便我可以为上述内容创建动态标签,但我将从头开始。

如果我尝试:

queryset = ProjectSite.objects.all()

我最终获得了ProjectSites,但是我无法提出一种优雅的方式将信息传递到模板,而只是将每个城市中每个项目的子集传递给模板。我希望至少得到一个像这样的列表:

  • 国家1
    • 状态
    • 城市1
      • 项目A
      • 项目B
    • 城市2
      • 项目C
  • 国家2

是否有适当的方法可以过滤到有序区域?理想情况下,我将具有一系列选项卡,“第一行国家”,“该国家第二个国家”,“该城市中的第三个城市”以及下面的那个城市中的所有项目地点。

1 个答案:

答案 0 :(得分:0)

这将使用反向外键关系(<model>_set)隐式添加到具有外键的所有模型中,以在字典中建立数据。

data = {"countries": []}
for country in Country.objects.all():
    country_data = {"country": country, "states": []}

    for state in country.state_set.all():
        state_data = {"state": state, "cities": []}

        for city in state.city_set.all():
            city_data = {"city": city, "projects": []}

            for project in city.project_set.all():
                city_data["projects"].append(project)

            state_data["cities"].append(city_data)

        country_data["states"].append(state_data)

    data["countries"].append(country_data)

应该返回大致如下的字典:

{
    "countries": [
        {
            "country": <Country object>,
            "states": [
                {
                    "state": <State object>,
                    "cities": [
                        {
                            "city": <City object>,
                            "projects": [
                                <Project object>,
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}