11

Questo è il mio models.py:Ottenere un "I seguenti tipi di contenuto sono obsoleti e devono essere cancellati" quando si tenta di eseguire una migrazione. Cosa significa questo e come posso risolverlo?

class Notification(models.Model): 
    user = models.ForeignKey(User) 
    createdAt = models.DateTimeField(auto_now_add=True, blank=True) 
    read = models.BooleanField(default=False, blank=True) 

    class Meta: 
     abstract = True 

class RegularNotification(Notification): 
    message = models.CharField(max_length=150) 
    link = models.CharField(max_length=100) 

class FNotification(Notification): 
    # same as Notification 
    pass 

Quando faccio python manage.py makemigrations, questo è quello che dice:

Migrations for 'CApp': 
    0019_auto_20151202_2228.py: 
    - Create model RegularNotification 
    - Create model FNotification 
    - Remove field user from notification 
    - Add field f_request to userextended 
    - Delete model Notification 

In primo luogo, è strano che si dice Remove field user from notification perché user è ancora nel mio modello Notiication (quindi se qualcuno può capire perché dice che dice 'rimuovendo l'utente da notifica', sarebbe fantastico!), ma comunque, quando mi sposto e cerco di fare python manage.py migrate ottengo questo messaggio:

Applying CMApp.0019_auto_20151202_2228... OK 
The following content types are stale and need to be deleted: 

    CApp | notification 

Any objects related to these content types by a foreign key will also 
be deleted. Are you sure you want to delete these content types? 
If you're unsure, answer 'no'. 

    Type 'yes' to continue, or 'no' to cancel: no 

Ho digitato no. Ma cosa significa esattamente questo, perché sto ricevendo questo messaggio e come faccio a fare in modo che non richieda questo messaggio?

+0

Ho capito perché ho dimenticato di eseguire l'ultimo commit del repository. La mia ultima migrazione locale non era l'ultima nel repository. : P Ho tirato il codice remoto, ho eseguito di nuovo le migrazioni e ho lavorato come un incantesimo. – joaorodr84

risposta

10

Il messaggio ricevuto viene attivato quando si rimuove/elimina un modello e si esegue una migrazione.

Nella maggior parte dei casi, è possibile eliminarli in modo sicuro. Tuttavia, in alcuni casi ciò potrebbe comportare la perdita di dati. Se altri modelli hanno una chiave esterna per il modello rimosso, anche questi oggetti verranno cancellati.

Here's the django ticket that requests to make deleting stale content types safer.

EDIT

Come @ x-yuri ha sottolineato, questo biglietto è stato fissato ed è stato rilasciato nel Django 1.11.

+0

Oh, quindi, poiché ho aggiunto "Abstract = True" al modello "Notification", è probabilmente il motivo per cui Django presume che l'ho cancellato. Qualche idea sul perché dice '- Rimuovi utente campo da notifica 'poi? Perché l'utente ForeignKey è ancora lì, quindi perché Django dice che è stato rimosso? – user2719875

+0

Non ne sono completamente sicuro. Forse puoi aggiungere il file di migrazione in modo che possiamo esaminare cosa sta succedendo. –

+0

@RodXavier nel mio caso ho un modello A che è stato cancellato con chiavi esterne sul modello B, C. Significa che eseguendo la migrazione, i dati nel modello B, C verranno eliminati o solo se è presente una chiave esterna modellare A? Grazie a – Pietro

Problemi correlati