我有一个不正常的情况,但是由于我是这个充满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,但是我无法提出一种优雅的方式将信息传递到模板,而只是将每个城市中每个项目的子集传递给模板。我希望至少得到一个像这样的列表:
是否有适当的方法可以过滤到有序区域?理想情况下,我将具有一系列选项卡,“第一行国家”,“该国家第二个国家”,“该城市中的第三个城市”以及下面的那个城市中的所有项目地点。
答案 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>,
]
}
]
}
]
}
]
}