2011-12-17 17 views
34

Ecco alcuni modelli:Modelli Django ForeignKey attributo on_delete: significato completo?

class UserProfile(models.Model): 
    name = models.CharField(max_length=30) 
    email = models.EmailField(unique=True, db_index=True) 
    birthday = models.DateField() 

class Photo(models.Model): 
    user = models.ForeignKey(UserProfile) 
    description = models.TextField(blank=True) 
    photo = models.ImageField(upload_to='img/photo') 

Diciamo che un utente ha 10 foto (10 oggetti di Photo modello). Quando l'utente si elimina, tutte quelle 10 file di database Photo si cancellano automaticamente? (Ho letto i documenti, ma l'inglese non è la mia lingua madre, quindi non ho capito tutto sull'attributo on_delete.)

risposta

15

questo è il comportamento predefinito, sì. è possibile modificare questo comportamento con on_delete

per ottenere un'illustrazione di questo, provare a eliminare un profilo utente nell'amministratore. mostra prima una pagina di avviso, elencando tutti gli oggetti correlati che verranno anch'essi eliminati

+2

Ha legato a 'on_delete' se stesso ... Penso che non hai letto il suo post completo? –

+0

Non voglio cambiare questo comportamento - ne ho bisogno! E cosa succede se cancella utente non dal pannello di amministrazione, ma riga di comando - l'effetto sarà lo stesso? L'effetto –

+1

è lo stesso. Si noti tuttavia che, per impostazione predefinita, l'archivio di file effettivo in Photo.photo * non * verrà eliminato – second

148

Passerò attraverso i valori per on_delete come si applicano a questo caso. Come si nota nei documenti, questi sono tutti in quel modulo models, quindi lo utilizzeresti come models.ForeignKey(UserProfile, on_delete=models.CASCADE), ecc.

Queste regole si applicano tuttavia si elimina un oggetto, sia che lo si faccia nel pannello di amministrazione o che si lavori direttamente con l'istanza Model. (Ma non avrà effetto se si lavora direttamente con il database sottostante in SQL.)

  • CASCADE: quando si elimina il UserProfile, verranno eliminati anche tutti i relativi Photo s. Questo è l'impostazione predefinita. (Quindi, in risposta a questo aspetto della tua domanda, sì, se si elimina il vostro account utente le foto verranno eliminati automaticamente.)

  • PROTECT: questo vi vieta di eliminazione di un UserProfile con relativi Photo s, sollevando una django.db.models.ProtectedError se provi. L'idea sarebbe che l'utente avrebbe bisogno di dissociare o cancellare tutti i Photo s prima che potessero cancellare il loro profilo.

  • SET_NULL: quando si elimina il UserProfile, esisterà ancora tutti associati Photo s, ma non sarà più associato a qualsiasi UserProfile. Ciò richiederebbe null=True nella definizione ForeignKey.

  • SET_DEFAULT: quando si elimina il UserProfile, tutti associati Photo s verranno modificati per puntare alla loro impostazione predefinita UserProfile come specificato dall'attributo default nella definizione ForeignKey (si potrebbe usare questo per passare le foto "orfani" fuori ad un determinato utente - ma questo non sta per essere comune, SET_NULL o SET() sarà molto più comune)

  • SET(): quando si elimina il UserProfile, l'obiettivo dei Photo s'ForeignKey sarà impostato al valore passato dentro alloFunzioneo cosa restituisce se è un chiamabile. (Scusate, non ho spiegato che bene, ma il docs avere un esempio che spiega meglio.)

  • DO_NOTHING: quando si elimina il UserProfile, tutti i relativi Photo s rimarranno inalterate, avendo così un riferimento rotto, a meno che hai usato qualche altro SQL per prendertene cura.

(Inoltre, on_delete non è un metodo. E 'un attributo del campo ForeignKey.)

+1

Ho provato CASCADE ma quando ho cancellato le foto il profilo utente è stato cancellato e ho provato PROTECT quando ho provato a eliminare le foto che ha generato un errore. Mi stavo chiedendo se questo è l'effetto collaterale dell'attributo on_delete sull'altra estremità della relazione. In particolare per PROTECT, come è possibile eliminare tutte le foto in modo che sia possibile eliminare il profilo utente se viene generato l'errore protetto? – Crystal

Problemi correlati