2012-01-25 13 views
9

Piszę projekt django. I chcesz wiedzieć, po tym, jak użytkownik usunie własne konto, czy istnieje sposób na wbudowanie django, aby automatycznie usunąć cały obiekt powiązany z tym użytkownikiem (np. Jakiś ogólny obcy klucz)? Czy powinienem użyć sygnału "post_delete", aby usunąć wszystkie powiązane obiekty?Django jak usunąć profil i posty użytkownika oraz wszystkie powiązania po usunięciu użytkownika?

+0

Czy na pewno związane z nimi obiekty nie są już usunięte? Nielegalne klucze ForeignKeys muszą zostać usunięte, aby uniknąć wystąpienia IntegrityError, a IIRC Django zrobi to domyślnie. Według ogólnego klucza obcego, masz na myśli właśnie [GenericForeignKey] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey)? Ponieważ to staje się bardziej skomplikowane. – AdamKG

+0

@AdamKG Myślę, że nie miałem na myśli GenericForeignKey specjalnie tutaj. Mam na myśli to, że KASKADĘ NA KAŻDĄ ZNAJDĘ mam już odpowiedź. Nie zrozumiałem jasno, co robi GenericForeignKey tak długo, jak Contenttype, studiuję. Kolejne pytanie, które być może nie jest względne w stosunku do tego, ale chcę zapytać: znalazłem implementację profilu użytkownika, wszystkie używają ForeignKey zamiast OneToOne. Czy mają tu związek wiele do jednego, czy to nie ma znaczenia. – Xinghan

Odpowiedz

5

Należy wyraźnie usunąć wszystkie generycznych zagranicznych najważniejszych odniesień do oryginalnego obiektu przed oryginalny obiekt zostanie usunięty. Na przykład

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() 

kaskadowego usuwania jest wielki, kiedy to działa, na przykład, na jeden do jednego relacji w modelach, ale nie wydaje się, aby pracować dla generycznych obcych kluczowych relacji.

+0

Dziękuję bardzo! – Xinghan

+0

Chociaż zgadzam się z twoim zaleceniem, stwierdzenie "nie wydaje się działać dla ogólnych relacji z kluczowymi kluczami obcymi" wymaga dalszych wyjaśnień, ponieważ nie jest to normalne. – Wtower

+0

@Wtower To było prawdą w 2012 roku (Django 1.4?), Ale wynika to z dokumentacji (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations), która teraz " jeśli usuniesz obiekt, który ma GenericRelation, wszystkie obiekty, które wskazują na GenericForeignKey, również zostaną usunięte ", co mogło być zmianą Django 1.7. –

Powiązane problemy