Django: объект BaseTable не поддерживает индексацию

Я перевожу свой проект на Django 1.8 и получаю ошибку, связанную с 'johnny cache. В частности, в 'johnny / cache.py /'.

Ошибка: lib / python2.7 / site-packages / johnny / cache.py ", строка 87, в таблицах get_tables_for_query = set([v[0] для v в getattr(query, 'alias_map', {}). Values ​​()])

Ошибка типа: объект 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))

1 ответ

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

Из документации Джонни Кэша:

Он работает с Django с 1.1 по 1.4 и с python 2.4 по 2.7.

Из вашего вопроса:

Я перевожу свой проект на Django 1.8.

На самом деле, похоже, что используемая вами библиотека крайне устарела и больше не поддерживается:

Последний коммит d96ea94 10 ноября 2014 г.

Другие вопросы по тегам