2016-08-03 22 views
0

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

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. –

+0

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

Antwort

1

Ihr Problem gefunden, als ich ein wenig weiter in Ihre Bibliothek schaute.

Vom Johnny Cache documentation:

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

Aus Ihrer Frage:

I'm migrating my project to Django 1.8.

In der Tat, es sieht aus wie die Bibliothek, die Sie verwenden ist jämmerlich veraltet und nicht mehr weiter gepflegt:

Latest commit d96ea94 on Nov 10, 2014