2016-03-03 22 views
5

Ho uno schema DB che ho ereditato da qualche codice legacy. Ora intendiamo usare Django per riflettere le tabelle in modelli. Questo significa che non posso avere le tabelle generate usando i modelli django. Lo schema della tabella si presenta in questo modo: -Come ottenere l'ID della chiave primaria generato automaticamente in Modelli Django

mysql> desc student_profile; 
+-------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+-------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| joining_on | datetime | YES |  | NULL |    | 
| brothername | varchar(45) | YES |  | NULL |    | 
+-------------+-------------+------+-----+---------+----------------+ 
3 rows in set (0.01 sec) 

Ora il modello Django che ho creato per questo schema si presenta così: -

class StudentProfile(models.Model): 
    id=models.IntegerField(primary_key=True) 
    joining_on=models.DateField() 
    brothername=models.CharField(max_length=45) 

    class Meta: 
     db_table="student_profile" 

Quando inserisco una riga in questo, in questo modo: -

StudentProfile.objects.insert(brothername="Bro") 

La riga è inserita correttamente. Ma non ho un modo per estrarre il campo id. Sembra che siccome questo campo non è un AutoField, django non copia sull'ID generato automaticamente da MySql. Cosa posso fare per ottenere il valore id con cui è stata creata la riga? Ho controllato (https://code.djangoproject.com/ticket/8799#comment:1) e questo sembra essere di progettazione. Ma ho ancora bisogno di un modo per arrivare allo id e farlo riflettere nel modello StudentProfile. Cosa posso fare?

Una soluzione potrebbe essere quella di sovrascrivere il valore predefinito save() e fornire esplicitamente lo id nel modello save(). Ma è nel modo giusto? Il database (è MySql) fornisce un modo per generare l'id, e devo essere in grado di usare questo fatto a mio vantaggio piuttosto che dover mantenere un contatore in esecuzione dall'applicazione. Qualche suggerimento?

+1

Cosa succede se non si definisce il campo 'id' nel modello a tutti? – Selcuk

+0

Se non lo faccio, Django ha creato automaticamente un campo del tipo project.app.StudentProfile.id o qualcosa del genere. Chiaramente il mio schema sottostante non ha questo nome come una colonna. In breve, voglio tutto ciò che offre 'AutoField' di Django, solo che voglio che il nome sia mio. – abhayAndPoorvisDad

+2

Django creerà una colonna denominata 'id' di default che è la stessa della colonna precedente. 'project.app.StudentProfile.id' è il nome del campo nel tuo codice Python, non è il nome del colum del database. Sei sicuro che non funzioni in questo modo? – Selcuk

risposta

6

È possibile saltare definire la colonna id del tutto, vale a dire:

class StudentProfile(models.Model): 
    # id=models.IntegerField(primary_key=True) 
    joining_on=models.DateField() 
    brothername=models.CharField(max_length=45) 

    class Meta: 
     db_table="student_profile" 

Django sarà creare o utilizzare una colonna di nome AutoIncrement id di default, che è lo stesso che la colonna eredità.

Se il nome della colonna era diverso, si potrebbe usare un AutoField con un nome diverso, come ad esempio:

my_id = models.AutoField(primary_key=True)