2016-08-03 2 views
0

Я переношу свой проект на Django 1.8, и я получаю сообщение об ошибке, связанном с кешем johnny. В частности, в «johnny/cache.py /».Django: объект BaseTable не поддерживает индексирование

Ошибка: Lib/python2.7/сайт-пакеты/джонни/cache.py», строка 87, в get_tables_for_query таблицы = множество ([v [0] для V в GetAttr (запросе 'alias_map' , {}) значение()])

TypeError:.. объект «BaseTable» не поддерживает индексирование

Я включил мой код ниже функции, где ошибка происходящая из КОНСУЛЬТАЦИИ нет ли я должен использовать что-то другое, чем «johnny -cache» для кэширования, было бы полезно и/или информация о том, что означает эта ошибка и как ее исправить. Спасибо!

def get_tables_for_query(query): 
""" 
Takes a Django 'query' object and returns all tables that will be used in 
that query as a list. Note that where clauses can have their own 
querysets with their own dependent queries, etc. 
""" 
from django.db.models.sql.where import WhereNode, SubqueryConstraint 
from django.db.models.query import QuerySet 
tables = set([v[0] for v in getattr(query, 'alias_map', {}).values()]) 


def get_sub_query_tables(node): 
    query = node.query_object 
    if not hasattr(query, 'field_names'): 
     query = query.values(*node.targets) 
    else: 
     query = query._clone() 
    query = query.query 
    return set([v[0] for v in getattr(query, 'alias_map',{}).values()]) 

def get_tables(node, tables): 
    if isinstance(node, SubqueryConstraint): 
     return get_sub_query_tables(node) 
    for child in node.children: 
     if isinstance(child, WhereNode): # and child.children: 
      tables = get_tables(child, tables) 
     elif not hasattr(child, '__iter__'): 
      continue 
     else: 
      for item in (c for c in child if isinstance(c, QuerySet)): 
       tables += get_tables_for_query(item.query) 
    return tables 



if query.where and query.where.children: 
    where_nodes = [c for c in query.where.children if isinstance(c, (WhereNode, SubqueryConstraint))] 
    for node in where_nodes: 
     tables += get_tables(node, tables) 

return list(set(tables)) 
+0

Что должна делать эта линия? Преступником здесь является 'v [0]', то есть индексирование. По-видимому, в какой-то момент вашего понимания 'v' является объектом« BaseTable », который не поддерживает этот оператор. –

+0

Я настроил свою функцию точно так же, как другие структуры кеша johnny, поэтому я не уверен, почему я получаю эту ошибку. Узнайте, как другие настроены здесь. Https://github.com/jmoiron/johnny-cache/commit/7e457518ee84b29917562bda3a739acc3d407a7e – Roshan

ответ

1

Нашли свою проблему, когда я немного углубился в вашу библиотеку.

От Johnny Cache documentation:

It works with Django 1.1 thru 1.4 and python 2.4 thru 2.7.

Ваш вопрос:

I'm migrating my project to Django 1.8.

На самом деле, это выглядит как библиотека, которую вы используете не безнадежно устарел и больше не поддерживается:

Latest commit d96ea94 on Nov 10, 2014

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