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
Bitte zeigen Sie eine vollständige Version der Datei, die das Problem veranschaulicht. –
@DanielRoseman, der vollständige Eintrag für loadtestdata.py wurde hinzugefügt. Selbst der Klassenname 'TestModel' ist was ich verwende :) – qeadz
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