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?
risposta
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()
Grazie mille! – Xinghan
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.
Grazie mille! – Xinghan
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
@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. –
Django consiglia di non eliminare gli utenti in quanto le chiavi esterne si romperanno. È per questo motivo che hanno incluso il metodo is_active.
Vedi https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active
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
@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