2012-01-25 17 views
9

Tôi đang viết một dự án django. Và muốn biết sau khi người dùng xóa tài khoản của riêng mình, có cách nào để tạo tự động xóa tất cả đối tượng liên quan đến người dùng này không (ví dụ: một số ngoại lệ chung)? Hoặc tôi nên sử dụng tín hiệu "post_delete" để xóa tất cả các đối tượng liên quan?Django làm thế nào để xóa hồ sơ của người dùng và bài viết và tất cả các assocation sau khi người dùng xóa?

+0

Bạn có chắc chắn các đối tượng liên quan chưa bị xóa không? Các khóa ForeignKey không phải nullable phải được xóa để tránh một IntegrityError, và IIRC Django sẽ làm như vậy theo mặc định. Bằng khóa chung chung, bạn có nghĩa là [GenericForeignKey] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey) cụ thể không? Bởi vì điều đó trở nên phức tạp hơn. – AdamKG

+0

@AdamKG Tôi nghĩ rằng tôi không có nghĩa là GenericForeignKey cụ thể ở đây. Những gì tôi có nghĩa là ON DELETE CASCADE mà tôi đã có một câu trả lời. Tôi đã không hiểu rõ ràng những gì GenericForeignKey làm miễn là Contenttype, tôi đang học. Một câu hỏi khác có thể không liên quan đến câu hỏi này, nhưng tôi muốn hỏi là, tôi đã tìm thấy một số triển khai hồ sơ người dùng, tất cả họ đều sử dụng ForeignKey thay vì OneToOne. Có phải họ cho rằng mối quan hệ nhiều người một ở đây hay không quan trọng. – Xinghan

Trả lời

13

Khi Django xóa đối tượng, theo mặc định nó sẽ mô phỏng hành vi của ràng buộc SQL ON DELETE CASCADE - nói cách khác, bất kỳ đối tượng nào có khóa ngoài trỏ vào đối tượng cần xóa sẽ bị xóa cùng với nó.

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

Cảm ơn bạn rất nhiều! – Xinghan

5

Bạn nên xóa một cách rõ ràng tất cả các tài liệu tham khảo quan trọng ngoại tổng quát để các đối tượng ban đầu trước khi bạn xóa các đối tượng gốc. Ví dụ

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

Các tầng xóa là tuyệt vời khi nó hoạt động, ví dụ, cho one-to-one mối quan hệ trong mô hình, nhưng nó dường như không làm việc cho các mối quan hệ chính nước ngoài nói chung.

+0

Cảm ơn bạn rất nhiều! – Xinghan

+0

Mặc dù tôi đồng ý với đề nghị của bạn, tuyên bố "nó dường như không làm việc cho các mối quan hệ chung nước ngoài chung" cần giải thích thêm vì đây không phải là trường hợp thông thường. – Wtower

+0

@Wtower Điều này đúng vào năm 2012 (Django 1.4?) Nhưng nó xuất hiện từ tài liệu (https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations) mà bây giờ " nếu bạn xóa một đối tượng có GenericRelation, bất kỳ đối tượng nào có GenericForeignKey trỏ vào nó cũng sẽ bị xóa "có thể là thay đổi Django 1.7. –