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,你能详细说明一下吗?