【问题标题】:Django Reverse Foreign Key filterDjango反向外键过滤器
【发布时间】:2018-09-13 00:12:10
【问题描述】:

我有一个我认为不正常的情况,但由于我是这个充满 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

是否有适当的方法过滤到有序区域?理想情况下,我应该有一系列选项卡,第一行国家,该国家的第二行,该州的第三个城市,下面是该城市的所有项目站点。

【问题讨论】:

    标签: python django


    【解决方案1】:

    这使用隐式添加到所有具有外键的模型的反向外键关系 (<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>,
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
    

    【讨论】:

    • 啊哈,我不知道 _set 属性!在文档中浏览了一下。字典可以在 html 视图中使用吗?
    • 您也可以使用 ForeignKey 字段上的“related_name”参数更改该属性的名称!很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多