Sto integrando un database MySQL da una app php in un nuovo progetto Django. Inspectdb ha funzionato bene, ho solo dovuto cambiare un paio di campi in ForeignKeys e ora tutti i dati correnti di lettura e modifica funzionano alla grande.Django - db legacy e problemi con il campo 'id'
Il problema è quando si tenta di creare una nuova voce, ottengo l'errore "Field 'id' doesn't have a default value"
. Il traceback inizia dalla chiamata form.save()
e l'eccezione viene dal cursore MySQL. Nella maggior parte dei casi la colonna è chiamato id
ma in un caso si tratta di un valore denominato:
class ModelOne(models.Model): #normal "id" named pk
id = models.AutoField(primary_key=True, db_column='id', default=None)
other_fields = ...
class ModelTwo(models.Model): #specific pk
named_pk = models.AutoField(primary_key=True, db_column='named_pk',
default=None)
other_fields = ...
Per ModelTwo, quando posto una forma valida, ottengo l'errore, ma poi se torno alla mia lista dei dati , il nuovo oggetto compare! E dopo aver controllato gli ultimi valori id
nella shell, posso vedere che stanno aumentando correttamente.
Ma per ModelOne (con solo id
), l'errore si presenta ancora e il pk diventa 2147483647 (il massimo) e i successivi salvataggi falliscono a causa di ID duplicati. (il pk più alto successivo è solo 62158)
Cosa devo fare per far funzionare correttamente questi campi ID?
aggiornamento: Ancora nessuna fortuna risolvere questo. Pensando a scaricare i dati e importarli in nuovi tavoli creati da Django. Sto ancora cercando una soluzione a questo problema.
Update2: Info dal guscio db
ModelOne:
+-------------+--------------+-------+------+---------+-----------------+
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | NO | PRI | NULL | auto_increment |
ModelTwo:
+-------------+--------------+-------+------+---------+-----------------+
| Field | Type | Null | Key | Default | Extra |
| named_pk | int(11) | NO | PRI | NULL | auto_increment |
Che cosa succede se si rimuove il 'default = Nessuno '? –
@Daniel Roseman - stessa cosa esatta. L'ho aggiunto solo nel tentativo di indirizzare direttamente quello che sembrava l'errore stava puntando su –