2012-01-25 3 views
9

Sto scrivendo un progetto di Django. E vuoi sapere dopo che l'utente cancella il suo account, c'è un modo in cui django build-in cancella automaticamente tutti gli oggetti relativi a questo utente (ad esempio qualche foreign_key generico)? O dovrei usare il segnale "post_delete" per eliminare tutti gli oggetti correlati?Django come eliminare il profilo e i post dell'utente e tutte le associazioni dopo l'eliminazione dell'utente?

+0

Sei sicuro gli oggetti correlati non sono già in corso l'eliminazione? Le chiavi esterne non annullabili devono essere eliminate per evitare un errore di integrità e IIRC Django lo farà per impostazione predefinita. Con la chiave esterna generica, intendi [GenericForeignKey] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey) in particolare? Perché questo diventa più complicato. – AdamKG

+0

@AdamKG Penso che non intendevo GenericForeignKey specificamente qui. Quello che intendo è l'ON DELETE CASCADE che ho già avuto una risposta. Non ho capito chiaramente cosa fa GenericForeignKey finché Contenttype, sto studiando. Un'altra domanda che forse non è relativa a questa, ma voglio chiedere è, ho trovato alcune implementazioni del profilo utente, tutte usano ForeignKey invece di OneToOne. Suppongono una relazione molti-a-uno qui o non importa. – Xinghan

risposta

13

Quando Django elimina un oggetto, per impostazione predefinita emula il comportamento del vincolo SQL ON DELETE CASCADE - in altre parole, tutti gli oggetti con chiavi esterne che puntano all'oggetto da eliminare verranno eliminati insieme a esso.

https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

b = Blog.objects.get(pk=1) 
# This will delete the Blog and all of its Entry objects. 
b.delete() 
+0

Grazie mille! – Xinghan

5

Si dovrebbe eliminare in modo esplicito tutti i generici riferimenti chiave esterna all'oggetto originale prima di eliminare l'oggetto originale. Per esempio

Image.objects.filter(object_id=object_to_be_deleted.id,content_type = ContentType.objects.get_for_model(bject_to_be_deleted.get_profile())).delete() 
object_to_be_deleted.delete() 

La cascata eliminare è grande quando funziona, per esempio, per uno-a-uno relazioni nei modelli, ma non sembra funzionare per generiche relazioni di chiave esterna.

+0

Grazie mille! – Xinghan

+0

Anche se sono d'accordo con la tua raccomandazione, l'affermazione "non sembra funzionare per le relazioni con le chiavi estranee generiche" necessita di ulteriori spiegazioni in quanto non si tratta del solito caso. – Wtower

+0

@Wtower Questo era vero nel 2012 (Django 1.4?) Ma appare dalla documentazione (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations) che ora " se elimini un oggetto che ha una GenericRelation, verranno eliminati anche tutti gli oggetti che hanno un GenericForeignKey che punta su di esso "che potrebbe essere stata una modifica di Django 1.7. –