2010-11-16 6 views
7

Ich versuche, ein Modell für eine bestehende DB zu erstellen. Unter Verwendung der Ausgabe von manage.py inspectdb sieht My models.py-Datei wie folgt:"unbekannte Spalte X.id" Fehler in Django mit vorhandenen DB

from django.db import models 

...some more stuff here... 

class Scripts(models.Model): 
    run_site = models.ForeignKey(Sites, db_column='run_site') 
    script_name = models.CharField(max_length=120) 
    module_name = models.CharField(unique=True, max_length=120) 
    type = models.CharField(max_length=24) 
    cat_name = models.CharField(max_length=90) 
    owner = models.ForeignKey(QAPeople, db_column='owner') 
    only_server = models.CharField(max_length=120, blank=True) 
    guest = models.IntegerField() 
    registered = models.IntegerField() 
    super = models.IntegerField() 
    admin = models.IntegerField() 
    run_timing = models.CharField(max_length=27) 
    manual_owner = models.ForeignKey(QAPeople, db_column='manual_owner') 
    script_id = models.IntegerField(unique=True,) 
    version = models.IntegerField() 
    comment = models.ForeignKey('ScriptComments', null=True, blank=True) 
    class Meta: 
     db_table = u'scripts' 

Wenn ich versuche, Scripts.objects.all() zu tun bekomme ich

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 68, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 83, in __len__ 
    self._result_cache.extend(list(self._iter)) 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 269, in iterator 
    for row in compiler.results_iter(): 
    File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 672, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 727, in execute_sql 
    cursor.execute(sql, params) 
    File "C:\Python26\lib\site-packages\django\db\backends\util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Python26\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 173, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
OperationalError: (1054, "Unknown column 'scripts.id' in 'field list'") 

Warum denkt django sollte es eine scripts.id Spalte sein? Wie repariere ich es ohne die Tabellen usw. fallenlassen?

Antwort

12

Es gibt immer ein implicit id field as auto incrementing primary key auf jedem Modell. Siehe primary_key in the Django docs, wie man dieses Feld zu einem anderen Namen ändert, aber es muss einen Primärschlüssel (auch in Ihrer Tabelle) geben.

Auch möchten Sie möglicherweise nicht eines Ihrer Felder super aufrufen, da es Python eingebaute super in der Klasse body shadowt. Es könnte Ihnen schwerfallen, eines Tages einen Fehler zu finden.

+1

Aus diesem Grund ist es eine gute Angewohnheit, 'model.pk' zu verwenden, um auf den Primärschlüssel statt auf' model.id' zu verweisen. –

0

Ich bin mir nicht sicher, ob you'r vertraut mit django-south?

Es ist ein schönes kleines Tool, das Sie Ihre Daten von einer Struktur zur anderen hilft migrieren und hilft auch, Probleme zu identifizieren, bevor Informationen an den Tisch commiting, was zu weniger Fehler und Debugging danach.

+0

Dieser Link ist unterbrochen. Das ist das Neue: http://south.readthedocs.io/en/latest/ –

Verwandte Themen