这样做的:
datas = models.Lfsa_eisn2.objects.raw("SELECT id, AREA_CODE_ID, OCUPATION_ID, YEAR_ID, GROUP_CONCAT(`cipher` separator ',') as `cipher` from core_lfsa_eisn2 group by AREA_CODE_ID , OCUPATION_ID,YEAR_ID" )
datas = list(datas)
print datas
...
OC9 Elementary occupations
S Other service activities
2012 UK United Kingdom
True
45.0,4.3,12.8,16.8,16.0,2619.3,:,60.2,57.2,247.4,344.0,208.2,5.5,42.4,455.5,87.1,233.4,24.1,168.6,180.5,362.2,:,43.9>]
...
例如0C9(OCUPATION_ID)
是指向基本职业的外键。
我想做datas.ocupation_id
之类的事情来获得OC9或小学职业。
你知道如何获得原始对象的元数据结构吗?
它应该像打印datas.meta
或datas.field
一样...我经过一段时间的观察和尝试后没有得到......
我想获得这样的信息:
[{'id': 1, 'OCUPATION_ID': 'Elementary occupations', 'AREA_CODE_ID': 'United Kingdom'}]
在简历中,基本上我不了解原始queryset对象数据结构的结构,以便访问它,然后再为JSON序列化。你有什么建议?
提前致谢!
答案 0 :(得分:1)
嗯,首先要做的事情。你做了之后:
datas = list(datas)
数据成为list
对象(不是RawQuerySet
)。可能你不需要这一行。
这让我们只有:
datas = models.Lfsa_eisn2.objects.raw("... ultraviolent SQL query ...")
现在数据是合适的RawQuerySet
。让我们打印它的属性。 Dir
对resque的作用(这是普遍规律:不知道如何处理obj
?print dir(obj)
并且你会知道所有事情:
>>> print dir(datas)
[..., 'columns', 'translations', ...]
一个疯狂的猜测:可能datas.columns
会给我们datas
结构。
>>> datas.columns
['id', 'area_code_id', ...]
是的,这就是我们需要的。
现在我们可以执行getattr
ultraviolence并打印所有属性:
>>> first = datas[0]
>>> for column in datas.columns:
>>> print getattr(first, column)
还有一件事。您正在SQL查询中执行超级暴力:您选择id
列,但GROUP BY
列列表中没有id
。不适用于Postgres。应该在sqlite和MySQL中工作(我认为不可能编写一个在MySQL中不起作用的查询)。