在Python Dict中循环的单行嵌套

时间:2015-03-04 16:11:38

标签: python django django-models

我有两种模式:网站和区域。一个地区有很多站点。

class Site(models.Model):

  name = models.CharField(max_length=200, unique=True)

class Region(models.Model):

  name = models.CharField(max_length=200, unique=True)
  sites = models.ManyToManyField('Site')

我想遍历查询集,以便得到一个dict(最终将成为JSON),如下所示:

regions = [
    {
        id: 1,
        name: "Region 1",
        sites: [
            {
                id: 1,
                name: "Site 1"
            },
            {
                id: 2,
                name: "Site 2"
            }
        ]
    },{
        id: 2,
        name: "Region 2",
        sites: [
            {
                id: 3,
                name: "Site 3"
            },
            {
                id: 4,
                name: "Site 4"
            }
        ]
    },
]

问题是,我想在一行中完成。我觉得我在{Region.name : {int(Site.id) : Site.name for Site in Region.sites.all()} for Region in Region.objects.all()}的正确轨道上,但是我在设置循环时遇到了麻烦。我觉得它应该像下面这样,但这不起作用:

{ 'id' : Region.id, 'name': Region.name, 'children' : { 'id': int(Site.id), 'name' : Site.name} for Site in Site.objects.all()} for Region in Region.objects.all()}

2 个答案:

答案 0 :(得分:0)

我没有测试过,但也许你想要这样的东西:

regions = [dict(r.items() + [('sites', r.site_set.all().values('id', 'name'))]) for r in Record.objects.all().values('id', 'name')]

UPD。但正如布兰登所指出的那样,最好不要使用如此复杂的oneliners。

答案 1 :(得分:0)

试试这个:

{'id' : region.id, 'name': region.name, 'sites' : { 'id': int(site.id), 'name' : site.name for site in region.sites.objects.all()} for region in Region.objects.all()}