2017-06-29 3 views
0

Dies kann eine einfache Python-Frage sein, jedoch habe ich nach der Suche nach "importierter Name nicht definiert" und ähnlichen Kriterien keine Antwort darauf gefunden.Sichtbarkeit der Klassendefinition

Ich habe eine models.py, wie von Django vorgeschrieben, mit Klassendefinitionen für alle Modelle.

Ich habe dann eine loadtestdata.py, die einfach eine programmatische Möglichkeit ist, die Datenbank mit einigen ersten Einträgen zu füllen.

In loadtestdata.py, importiere ich alle Modelle mit "from myproject.models import *".

Dies scheint als 'globalen Code' in loadtestdata.py zu funktionieren ist in der Lage, alle Klassennamen aus models.py zu sehen. Es kann die Datenbank gut füllen.

Allerdings Wenn ich eine Funktion in loadtestdata.py definieren, plötzlich kann diese Funktion keinen der importierten Klassennamen sehen.

Zum Beispiel würde diese Funktion nicht ImportedModelName sehen:

def AddSomeEntries(list1): 
    for value in list1: 
    new_model = ImportedModelName() 
    # set some stuff on the model 
    new_model.save() 

AddSomeEntries([1,2,3,4,5]) 

Allerdings habe ich das schreiben konnte und es sieht ImportedModelName gerade fein

new_model = ImportedModelName() 
# set some stuff on the model 
new_model.save() 

Warum das ehemalige Beispiel nicht die importierte Klasse sehen , aber das letzte Beispiel kann?

EDIT:

schnitt ich den loadtestdata.py auf sein absolutes Minimum nach unten, und das ist es

from django.contrib.auth.models import User 
User.objects.filter(email='[email protected]').delete() 
User.objects.create_superuser('someuser', '[email protected]', 'somepassword') 

from django.db import models 
from myproject.models import * 

from datetime import datetime 

def AddTestModel(list_data): 
    for entry in list_data: 
     test_model = TestModel() 
     test_model.name = entry 
     test_model.save() 

AddTestModel([1,2,3]) 

In dieser Datei schlägt fehl, weil Nameerror: name 'TestModel' nicht definiert ist.

Allerdings, wenn ich ersetzen die Funktion AddTestModel mit diesem:

for entry in [1,2,3]: 
    test_model = TestModel() 
    test_model.name = entry 
    test_model.save() 

Es funktioniert gut. Hinweis: oben, abgesehen von der Änderung der Datenbank Login-Daten, ist jetzt genau was ist in meiner loadtestdata.py.

Die models.py mit diesem beginnt (es hat viele andere Modelldefinitionen, die ich aus nicht abstreifen kann, weil django wird sich beschweren, aber sie sind alle einfache Definitionen, die sicherlich nicht mit einem ‚TestModel‘ Namen kollidieren können):

from django.db import models 

class TestModel(models.Model): 
    name = models.CharField(max_length=50) 
    def __str__(self): 
     return self.name 
+3

Bitte zeigen Sie eine vollständige Version der Datei, die das Problem veranschaulicht. –

+0

@DanielRoseman, der vollständige Eintrag für loadtestdata.py wurde hinzugefügt. Selbst der Klassenname 'TestModel' ist was ich verwende :) – qeadz

+0

Ich füge nur noch eine andere Sache hinzu - offensichtlich muss die loadtestdata.py von 'im Kontext von django' ausgeführt werden, damit sie tatsächlich die Datenbankeinträge erstellen kann. Es wird ausgeführt über: python manage.py shell qeadz

Antwort

0

bei der Arbeit durch diesen Beitrag zu erklären, hatte ich eine zufällige Idee, die (nach ein paar google-Suche) in dieser Folge:

Wenn ich führen Sie das Skript, das ich so mit diesem tue:

python manage.py shell < loadtestdata.py 

Ich weiß nicht, wie das funktionell verschiedene, dies zu:

python manage.py shell 
>>> exec(open('loadtestdata.py').read()) 

aber diese Arbeiten (ist, dass Funktionen, die ich in loadtestdata.py definieren können die importierten Klassennamen sehen), während die erstere die erzeugt 'Name ist nicht definiert' Fehler.

Verwandte Themen