Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dict中循环的单行嵌套_Python_Django_Django Models - Fatal编程技术网

Python Dict中循环的单行嵌套

Python Dict中循环的单行嵌套,python,django,django-models,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') 我想循环查询集,以获得最终将成为JS

我有两个模型:站点和区域。一个地区有许多地点

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')
我想循环查询集,以获得最终将成为JSON的dict,如下所示:

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:{intSite.id:Site.name for 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()}

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

regions = [dict(r.items() + [('sites', r.site_set.all().values('id', 'name'))]) for r in Record.objects.all().values('id', 'name')]
UPD。但正如Brandon所指出的,最好不要使用如此复杂的OneLiner。

试试这个:

{'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()}

您可以在querysetsimo上使用函数,列表理解非常方便,但一旦开始嵌套它们,就很难阅读。为什么不在你的Region类中添加一个classmethod来返回你需要的值,这样你就可以在你的视图中使用一行了?Brandon,你能详细说明一下吗?