获取 django 中原始查询集的结构以序列化它或浏览数据



正在做:

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.metadatas.field...经过相当长的一段时间寻找和尝试后,我没有得到...

我想获得一些这样的信息:

[{'id': 1, 'OCUPATION_ID': 'Elementary occupations', 'AREA_CODE_ID': 'United Kingdom'}]

在简历中,基本上我不了解原始查询集对象数据结构的结构来访问它,然后为JSON进行序列化。你有什么建议?

提前感谢!

嗯,首先要做的事。在您这样做之后:

datas = list(datas)

数据成为list对象(不是RawQuerySet)。可能,你不需要这条线。

这给我们留下的只有:

datas = models.Lfsa_eisn2.objects.raw("... ultraviolent SQL query ...")

现在数据是一个适当的RawQuerySet.让我们打印它的属性。 Dir功能(这是普遍规律:不知道如何处理objprint dir(obj),你会知道一切):

>>> print dir(datas)
[..., 'columns', 'translations', ...]

一个疯狂的猜测:可能datas.columns会给我们datas结构。

>>> datas.columns
['id', 'area_code_id', ...]

是的,这就是我们所需要的。

现在我们可以执行getattr极端暴力并打印所有属性:

>>> first = datas[0]
>>> for column in datas.columns:
>>>     print getattr(first, column)

还有一件事。你在SQL查询中做了一些极端暴力的事情:你选择了idGROUP BY但列列表中没有id。在邮政格雷斯中不起作用。应该在sqlite和MySQL中工作(我认为不可能编写在MySQL中不起作用的查询)。

最新更新