我有两种模式:网站和区域。一个地区有很多站点。
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()}
答案 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()}