2012-01-25 11 views
9

Bir django projesi yazıyorum. Kullanıcı kendi hesabını sildikten sonra bilmek isterse, bu kullanıcıyla ilgili tüm nesneyi (ör. Bazı jenerik foreign_key) otomatik olarak silmek için django build-in bir yol var mı? Ya da ilgili tüm nesneleri silmek için "post_delete" sinyalini kullanmalı mıyım?Django, kullanıcı profili ve yayınları ve kullanıcı silindikten sonra yapılan tüm paylaşımları nasıl silebilir?

+0

https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.is_active görüyor musunuz? IntegrityError'dan kaçınmak için null olmayan ForeignKey'lerin silinmesi gerekir ve IIRC Django varsayılan olarak bunu yapar. Genel yabancı anahtar ile, özellikle [GenericForeignKey] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey) kastediyor musunuz? Çünkü bu daha karmaşık hale geliyor. – AdamKG

+0

@AdamKG Özellikle burada JenericForeignKey demek istemedim. Demek istediğim, zaten bir cevabı olan ON DELETE CASCADE. GenericForeignKey'nin Contenttype kadar uzun süre çalıştığı şeyi tam olarak anlamadım. Bu soruya göre değil, ama sormak istediğim başka bir soru, bazı kullanıcı profili uygulamalarını buldum, hepsi OneToOne yerine ForeignKey kullanıyorlar. Burada bire bir ilişki var mı, yoksa önemli değil. – Xinghan

cevap

13

Django bir nesneyi sildiğinde, varsayılan olarak SQL kısıtlaması AÇIK DELETE CASCADE davranışını öykünür; başka bir deyişle, silinecek nesneye işaret eden yabancı anahtarların bulunduğu nesneler de silinir.

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

Çok teşekkür ederim! – Xinghan

5

orijinal nesneyi silmeden önce açıkça orijinal nesneye jenerik yabancı anahtar referanslar tümünü silmek gerekir. o modellerinde bire bir ilişkiler için, örneğin, çalışır, ancak genel yabancı anahtar ilişkileri için çalışmak görünmüyor Örneğin

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

basamaklı silmek büyüktür.

+0

Çok teşekkür ederim! – Xinghan

+0

Tavsiyenizi kabul etmeme rağmen, "genel yabancı anahtar ilişkileri için işe yaramıyor" ifadesi, bu olağan durum olmadığı için daha fazla açıklama gerektirmektedir. – Wtower

+0

@Wtower Bu, 2012'de (Django 1.4?) Geçerliydi, ancak şu anda belgelerin (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations) " Bir GenericRelation içeren bir nesneyi silerseniz, buna bir GenericForeignKey işaret eden herhangi bir nesne de silinecektir "Django 1.7 değişikliği olabilirdi. –

7

Yabancı anahtarlar kırılacağından Django, kullanıcıları silmeyi önermez. Bu nedenle is_active yöntemini dahil etmişlerdir.

Eğer ilgili nesneler zaten silinmiş edilmiyor emin

+0

Çok teşekkür ederim! – Xinghan

+0

Bu eski ve muhtemelen eski bir tavsiye ve bağlantı bozuk. – Wtower

İlgili konular