2010-04-20 5 views
5

Есть ли способ получить нейтральный словарь в Django? Это будет курсор, который является скорее диктом, чем кортежем. Я вынужден использовать Oracle для школьного проекта, над которым я работаю.Django Backend-neutral DictCursor

в модуле MySQLDb Python это называется DictCursor.

С вдохновляющей предложением WoLpH, я знаю, что я очень близко ..

def dict_cursor(cursor): 
    for row in cursor: 
     yield dict(zip(cursor.description, row)) 

Итерация и печати каждой строки курсора используется для привести:

(482072, 602592, 1) 
(656680, 820855, 2) 
(574968, 718712, 4) 
(557532, 696918, 3)) 

Но с dict_cursor я получаю:

{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 482072, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 1, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 602592} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 656680, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 2, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 820855} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 574968, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 4, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 718712} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 557532, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 3, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 696918} 

Я только хочу, чтобы он использовал ключ, например «NET SPENT».

После уточнения его немного больше, это похоже на работу:

def dict_cursor(cursor): 
    for row in cursor: 
     out = {} 
     for i,col in enumerate(cursor.description): 
      out[col[0]] = row[i] 
     yield out 

-

{'NET_COLLECTED': 602592, 'NET_SPENT': 482072, 'LOT': 1} 
{'NET_COLLECTED': 820855, 'NET_SPENT': 656680, 'LOT': 2} 
{'NET_COLLECTED': 718712, 'NET_SPENT': 574968, 'LOT': 4} 
{'NET_COLLECTED': 696918, 'NET_SPENT': 557532, 'LOT': 3} 
+0

Я изменил свой курсор, я неправильно понял объект описания, который кажется :) – Wolph

ответ

6

Вы можете написать его в пару строк :)

def dict_cursor(cursor): 
    description = [x[0] for x in cursor.description] 
    for row in cursor: 
     yield dict(zip(description, row)) 

Или если вы действительно хотите сэкономить место:

simplify_description = lambda cursor: [x[0] for x in cursor.description] 
dict_cursor = lambda c, d: dict(zip(d, r) for r in c)) 
+2

Этот однострочный лайнер не работает b/c, вы потеряли инструкцию yield, и я не вижу, как вы можете уступить одна строка с момента выхода не может быть частью списка. –

+2

Вы совершенно правы, я ее модифицировал :) – Wolph

+1

Когда вы делаете это с такими столбцами, как date, оно возвращает что-то вроде datetime.date (2010,10,21) а не возвращать фактический объект даты. Я пытаюсь вернуть пользовательский набор результатов SQL как JSON в мой браузер. – mikec

Смежные вопросы