2010-12-22 18 views
3

Ich möchte eine globale Variable in meiner Django-App haben, die die resultierende Liste von Objekten speichert, die ich später in einigen Funktionen verwende, und ich möchte nicht mehr als einmal Abfrage-Set auswerten, ich mache es so:Django globales Queryset

from app.models import StopWord 

a = list(StopWord.objects.values_list('word', flat=True)) 
... 

def some_func(): 
    ... (using a variable) ... 

das scheint mir in Ordnung, aber das Problem ist, dass syncdb und Test Befehl eine Ausnahme auslösen:

django.db.utils.DatabaseError: (1146, "Table 'app_stopword' doesn't exist") 

ich weiß nicht, wie dies loszuwerden, kann ich auf ein am Falsche Weg?

+0

Ist Ihre App in 'settings.INSTALLED_APPS' aufgelistet? – Seth

+0

ja, es ist dort – dragoon

Antwort

1

Initialisieren Sie keine Abfragen in einem globalen Bereich. Binden Sie None an den Namen, dann schreiben Sie eine Funktion, die zuerst überprüft, ob der Wert None ist, und wenn dies der Fall ist, generiert die Daten und gibt dann den Wert zurück.

+0

du hast Recht, in der Tat – dragoon

1

Es hört sich an, als ob die App, zu der StopWord gehört, sich nicht in Ihrer installierten app-Einstellung befindet oder Sie haben syncdb nicht ausgeführt, um die Tabelle zu generieren.

Das Speichern eines "globalen Werts" kann mit der django cache framework simuliert werden.

# there is more to it then this - read the documentation 
# settings.py needs to be configured. 

from django.core.cache import cache 

class StopWord(models.Model): 
    ... # field definitions 

    @classmethod 
    def get_all_words(cls): 
     key = 'StopWord.AllCachedWords.Key' 
     words = cache.get(key) 
     if words is None: 
      words = list(StopWord.objects.values_list('word', flat=True)) 
      cache.set(key, words) 
     return words 

#elsewhere 
from app.models import StopWord 

for word in StopWord.get_all_words(): 
    # do something 

Das oben genannte behandelt auch eine Art Cache-Invalidisierung. Ihre Einstellungen sollten ein Standard-Timeout festlegen, oder Sie können Ihr eigenes Timeout als einen 3. Parameter auf cache.set() festlegen. Dadurch wird sichergestellt, dass der Cache während der meisten Datenbankaufrufe immer wieder aktualisiert wird, sodass neue Stoppwörter verwendet werden können, ohne dass die Anwendung neu gestartet werden muss.