Django:'BaseTable'对象不支持索引

时间:2016-08-03 14:28:28

标签: python django indexing django-1.8 django-johnny-cache

我正在将我的项目迁移到Django 1.8,并且我收到了与'johnny cache相关的错误。特别是'johnny / cache.py /'。

错误: lib / python2.7 / site-packages / johnny / cache.py“,第87行,在get_tables_for_query中     tables = set([v [0] for get in getattr(query,'alias_map',{})。values()])

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))

1 个答案:

答案 0 :(得分:1)

当我进一步查看你的图书馆时发现了你的问题。

来自Johnny Cache documentation

  

它适用于Django 1.1至1.4和python 2.4至2.7。

从你的问题:

  

我正在将我的项目迁移到Django 1.8。

事实上,您使用的库看起来已经过时且不再维护:

  

2014年11月10日最新提交d96ea94