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

时间:2014-01-15 10:44:50

标签: django serialization django-queryset

这样做的:

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'}]

在简历中,基本上我不了解原始queryset对象数据结构的结构,以便访问它,然后再为JSON序列化。你有什么建议?

提前致谢!

1 个答案:

答案 0 :(得分:1)

嗯,首先要做的事情。你做了之后:

datas = list(datas)

数据成为list对象(不是RawQuerySet)。可能你不需要这一行。

这让我们只有:

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

现在数据是合适的RawQuerySet。让我们打印它的属性。 Dir对resque的作用(这是普遍规律:不知道如何处理objprint 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中不起作用的查询)。