2010-11-16 12 views
7

Sto provando a creare un modello per un DB esistente. Utilizzando l'output di manage.py inspectdb, Il mio file models.py si presenta così:"unknown column X.id" errore in django utilizzando DB esistente

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' 

Quando provo a fare Scripts.objects.all() ricevo

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'") 

Perché Django che ci dovrebbe essere una colonna scripts.id? Come risolverlo senza lasciando cadere i tavoli ecc.?

risposta

12

C'è sempre uno implicit id field as auto incrementing primary key predefinito su ogni modello. Vedi primary_key in the Django docs come cambiare quel campo con un altro nome, ma ci deve essere una chiave primaria (anche nella tabella).

Inoltre, non è possibile chiamare uno dei campi super, poiché ombreggia il super di Python incorporato nel corpo della classe. Potresti avere difficoltà a trovare un insetto un giorno.

+1

Ecco perché è una buona abitudine usare 'model.pk' per riferirsi alla chiave primaria piuttosto che a' model.id'. –

0

io non sono sicuro se you'r familiarità con django-south?

E 'un piccolo strumento piacevole che consente di migrare i dati da una struttura all'altra e aiuta anche a identificare i problemi prima di commettere informazioni al tavolo, causando meno errori e debug in seguito.

+0

Questo link è rotto. Questo è il nuovo: http://south.readthedocs.io/en/latest/ –

Problemi correlati