2012-07-30 35 views
6

Tôi cố gắng để xóa bỏ và tải lại một bảng trong mô hình django của tôi, vàdjango mô hình:. Objects.all() xóa() không

>>> models.PuzzleSum.objects.all().count() 
2644 
>>> models.PuzzleSum.objects.all().delete() 
>>> models.PuzzleSum.objects.all().count() 
2535 

... wtf? Luôn luôn là số ma thuật 109. Tôi biết tôi chỉ có thể đi vào cơ sở dữ liệu và xóa chúng bằng tay (hoặc vòng lặp cho đến khi tất cả chúng đều biến mất) nhưng tôi tò mò.

(Django 1.3.1 trên Mac OS X Lion btw)

+0

dunno, có thể QuerySet của BaseSum đã được đặt thành Trình quản lý tùy chỉnh? ví dụ. https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

Ý tưởng hay nhưng không. Đó là một kịch bản tải dữ liệu chạy từ một vỏ django, và (cố gắng) xóa là điều đầu tiên tôi làm sau khi nhập khẩu các mô hình. – AlanL

+0

Bạn có thể thêm mã cho PuzzleSum và bất kỳ mô hình liên quan nào không? –

Trả lời

2

Có, Django đang lưu trữ tất cả các đối tượng trong một dict, và sau đó xóa từng đối tượng một. Đó là lý do tại sao chỉ có các mục duy nhất bị xóa, vì nó lặp lại chúng. Đây là từ lớp Django Collector, thu thập các mô hình để xóa:

self.data = SortedDict([(model, self.data[model]) 
         for model in sorted_models]) 

và sau đó:

# delete instances 
for model, instances in self.data.iteritems(): 
    query = sql.DeleteQuery(model) 
    pk_list = [obj.pk for obj in instances] 
    query.delete_batch(pk_list, self.using) 

Chừng nào bạn đã ghi đè __hash__ của mô hình của bạn, khi các mô hình được lưu trữ trong dict self.data, chỉ những cái duy nhất được lưu trữ, và sau đó bị xóa.

0

Chuyển đổi nhận xét của tôi ở trên vào một câu trả lời cho câu hỏi:

Tôi đã ghi đè bămeq trong PuzzleSum vì một định nghĩa cụ thể của "trùng lặp" mà tôi muốn sử dụng. Và đoán xem: Tôi có 109 giá trị băm riêng biệt. Django phải sử dụng một tập hợp các đối tượng ở đâu đó trong logic xóa của nó.

Các vấn đề liên quan