Ich migiere mein Projekt nach Django 1.8 und erhalte eine Fehlermeldung bezüglich 'Johnny Cache'. Speziell in 'johnny/cache.py /'.Django: 'BaseTable' Objekt unterstützt keine Indizierung
Fehler: lib/python2.7/site-packages/johnny/cache.py“, Linie 87, in get_tables_for_query Tabellen = set ([v [0] für v in getattr (Abfrage, 'alias_map' , {}) Werte()])
Typeerror:.. ‚BaseTable‘ Objekt unterstützt keine Indizierung
ich meinen Code unten für die Funktion enthalten sind, in dem der Fehler von Ursprungs Rat Nr ob ich sollte etwas anderes als "johnny-cache" zum Caching verwenden, wäre hilfreich und/oder Informationen darüber, was die Bedeutung dieses Fehlers und wie es zu beheben ist. Danke!
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))
Was soll diese Linie tun? Der Täter ist hier 'v [0]', also Indexierung. Anscheinend ist "v" zu einem bestimmten Zeitpunkt ein "BaseTable" -Objekt, das diesen Operator nicht unterstützt. –
Ich habe meine Funktion genau wie andere Johnny Cache-Strukturen eingerichtet, so bin ich mir nicht sicher, warum ich diesen Fehler bekomme. Sehen Sie sich an, wie andere sich hier eingerichtet haben https://github.com/jmoiron/johnny-cache/commit/7e457518ee84b29917562bda3a739acc3d407a7e – Roshan