2011-12-21 14 views
6

Ho già un modello,Come aggiungere 1-1 campo relazione in un modello esistente attraverso il Sud migrazione

class ModelA(models.Model): 
    name = models.CharField (max_length = 255, blank = False) 

e ho molte voci in essa. Ora voglio aggiungere un campo in essa, che è

user = models.OneToOneField(User) 

Come faccio ad aggiungere questo campo in ModelA? C'è qualche soluzione oltre a cancellare tutte le voci precedenti?

+0

E qual è il problema? '--auto' non funziona? – DrTyrsa

+0

'--auto' funziona ma richiede il valore predefinito per le voci precedenti? – Ahsan

+0

Il campo 'utente' è' unique = True' e 'null = False' – Ahsan

risposta

11

vorrei utilizzare questo schema:

  1. Add "user = models.OneToOneField (User, null = True)" al tuo modello (non rimuovere il campo "Nome")
  2. run ' manage.py schemamigration --auto '. E applica la migrazione. Ora ci sono due colonne nella tua tabella.
  3. Ora creare un datamigration. Modifica il file: è necessario eseguire il loop su tutti gli oggetti nel modello e impostare il campo utente.
  4. Rimuovere il "nome = models.CharField" dal file model.py. E rimuovere null = True dal campo utente.
  5. eseguire 'manage.py schemamigration --auto'. E applica la migrazione

BTW, se si utilizza OneToOneField() senza null = True, è possibile impostare primary_key = True su questo campo, poiché deve essere univoco. Ma non so se il sud possa gestire questa migrazione.

+0

dopo il punto 5, quando sto per migrare, la migrazione chiede di aggiungere valore predefinito per l'utente perché passa a NOT NULL dallo stato NULL. Quindi quale sarà il valore predefinito? stringa vuota non funziona :( – Ahsan

+0

Prova 0, oppure modifica il file di migrazione dello schema di creazione e assegna un valore predefinito a 0. – guettli

+2

Lo stesso identico approccio funziona per le migrazioni di Django (senza Sud), con "python manage.py makemigrations" per passaggi 2 e 5. Grazie! – mlncn

Problemi correlati