2010-12-07 5 views
26

Wenn ich die Django-Shell verwende, wird ein Fehler angezeigt. Dies ist der Fehler:Das Definieren einer Modellklasse in der Django-Shell schlägt fehl

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
... 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "D:\Python25\lib\site-packages\django\db\models\base.py", line 51, in __new__ 
    kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
IndexError: list index out of range 

Was kann ich tun?

+0

Ähnliche Probleme diskutiert unter: http://stackoverflow.com/questions/2215403/exception-when-trying-to-install-django-treebeart-based-on-instructions – pyfunc

+0

versuchen, das model_module .__ name__ an dieser Stelle . – pyfunc

Antwort

44

Die Modelldefinition in einer Anwendung kommen muss - der Fehler, den Sie dort sind zu sehen ist, dass es zu nehmen versucht, die __name__model_module - was so etwas wie project.appname.models für project\appname\models.py sein sollte - und den Namen der Anwendung erhalten, appname. In der interaktiven Konsole ist die __name__ des Moduls '__main__' - also schlägt es fehl.

Um dies zu umgehen, müssen Sie die app_label selbst in der Meta Klasse angeben;

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
...  class Meta: 
...   app_label = 'test' 

Zur Erklärung, warum Sie das tun können, um die Datei in der Zurückverfolgungs erwähnt zu sehen, D:\Python25\lib\site-packages\django\db\models\base.py:

if getattr(meta, 'app_label', None) is None: 
     # Figure out the app_label by looking one level up. 
     # For 'django.contrib.sites.models', this would be 'sites'. 
     model_module = sys.modules[new_class.__module__] 
     kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
    else: 
     kwargs = {} 

(Wo meta die Meta Klasse ist, sehen nur oben in dieser Datei.)

+0

Hallo @Chris, der Name meiner App ist "task2", also sollte ich app_label = 'task2' schreiben, ja? – zjm1126

+4

@ zjm1126: Ja, das wird tun. Da dies in der interaktiven Konsole ist, spielt es keine Rolle; Ich nehme an, dass Sie aus irgendeinem Grund nur mit dem Modell rumspielen - wenn Sie verwenden wollen, was in "task2" ist, sollten Sie natürlich 'from task2.models import Poll 'verwenden. –

0

Diese andere Antwort funktioniert definitiv für die interaktive Eingabeaufforderung, aber ich denke nicht, dass die Absicht des ersten Blocks von Code tatsächlich ausgeführt werden sollte. Unmittelbar nach dem Code in the models documentation, wird erwartet, dass Sie die nächsten Codes in Ihre models.py-Datei einfügen, die während des vorherigen Tutorials erstellt wurde ... Ich nehme an, das ist der Grund, warum sie diesen Abschnitt "Quick Example" subtil gekennzeichnet haben. Was für Kopfschmerzen auch für mich!

+0

Weiterhin heißt es weiter in diesem Absatz: "Das obige Personenmodell würde eine Datenbanktabelle wie ... erstellen", was darauf hindeutet, dass es niemals beabsichtigt war, so zu laufen, wie es ist. –

0

Ich stieß auf dieses Problem mit Eclipse, Django und PyDev. Ich musste die Anwendung (anstelle einer .py-Datei zum Beispiel) im PyDev-Paket-Explorer (linkes Fenster) auswählen lassen, bevor ich auf Ausführen klicke, damit alles ordnungsgemäß funktioniert.

Verwandte Themen