Làm thế nào để xóa một bản ghi trong các mô hình Django?


267

Tôi muốn xóa một hồ sơ cụ thể. Nhu la

delete from table_name where id = 1;

Làm thế nào tôi có thể làm điều này trong một django model?


16
Cảm ơn đã đặt câu hỏi. Đôi khi RTFM mất nhiều thời gian hơn so với tìm kiếm Google và SO, bằng chứng là số lượt trả lời bình chọn và số lượt xem
Freedom_Ben

8
Đồng ý với @Freedom_Ben, nhưng đối với những độc giả tương lai thích hướng dẫn sử dụng f *, đây là thứ bạn đang tìm kiếm: docs.djangoproject.com/en/dev/topics/db/queries/ trộm
Dinei

Câu trả lời:


512

Có một vài cách khác nhau:

Để xóa nó trực tiếp:

SomeModel.objects.filter(id=id).delete()

Để xóa nó khỏi một thể hiện:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
Lưu ý rằng cái đầu tiên sẽ không gọi phương thức .delete () của đối tượng, vì vậy nếu bạn có mã 'dọn dẹp' trong phương thức đó thì nó sẽ không được gọi. Nói chung không phải là một vấn đề, nhưng đáng lưu ý.
Matthew Schinckel

8
@Matthew Schinckel: đó là sự thật. Nếu bạn muốn có một phương pháp xóa tùy chỉnh hơn bạn nên sử dụng pre_deletehoặc post_deletetín hiệu thay thế.
Wolph

2
Tôi không biết trường hợp nào sau DJango 1.4, nhưng đây thực sự là tìm nạp tất cả các PK và sau đó xóa bởi các PK đó. Vì vậy, ví dụ: nếu bạn xóa bởi một trường tùy ý, điều này có thể chậm hơn thì đối tác SQL ... :(
Vajk Hermecz

1
@VajkHermecz: đó là sự thật và hành vi dự kiến ​​vì các tín hiệu xóa. Hệ thống tín hiệu Django phải theo dõi tất cả các thay đổi cơ sở dữ liệu vì một cái gì đó có thể móc vào nó (giống như đảo ngược).
Wolph

3
Bạn có thể sử dụng giá trị trả về của delete()để kiểm tra những gì bạn đã xóa. Nó trả về một tuple với số lượng các đối tượng bị xóa và một từ điển với các chi tiết về các loại đã xóa, ví dụ (1, {'yourapp.SomeModel': 1}).
mcb

37
MyModel.objects.get(pk=1).delete()

điều này sẽ đưa ra ngoại lệ nếu đối tượng có khóa chính được chỉ định không tồn tại bởi vì lúc đầu, nó cố gắng truy xuất đối tượng đã chỉ định.

MyModel.objects.filter(pk=1).delete()

điều này sẽ không đưa ra ngoại lệ nếu đối tượng có khóa chính được chỉ định không tồn tại và nó trực tiếp tạo ra truy vấn

DELETE FROM my_models where id=1

1
Typo trong MyModel.object.filter(pk=1).delete(). Nó phải là "đối tượng".
Nigel

8

nếu bạn muốn xóa một thể hiện thì viết mã

delet= Account.objects.get(id= 5)
delet.delete()

nếu bạn muốn xóa tất cả thì hãy viết mã

delet= Account.objects.all()
delete.delete()

7

Nếu bạn muốn xóa một mục

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

Nếu bạn muốn xóa tất cả các mục trong Wishlist chẳng hạn

Wishlist.objects.all().delete()

6

Wolph cung cấp một câu trả lời tốt tập trung mã. Hãy để tôi dán tài liệu chính thức ở đây, để mọi người tham khảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.