này không thể được thực hiện trong một hoạt động queryset duy nhất. Theo tôi biết nó thậm chí không thể được thực hiện trong một truy vấn với SQL thô. Vì vậy, bạn sẽ luôn cần cuộc gọi cập nhật cho từng đối tượng cần được cập nhật. Vì vậy, cả hai giải pháp của bạn và Collin Anderson có vẻ khá tối ưu cho mô tả của bạn.
Tuy nhiên, trường hợp sử dụng của bạn là gì? Thực sự toàn bộ danh sách sẽ thay đổi mỗi lần? Trong hầu hết các trường hợp, điều này có vẻ rất khó xảy ra. Tôi có thể thấy một số cách tiếp cận khác nhau.
Bạn tiết kiệm lĩnh vực trật tự như bạn nói, nhưng bạn có thể tạo một diff để xem danh sách theo thứ tự: def
update_ordering(model, order):
""" order is in the form [id,id,id,id] for example: [8,4,5,1,3] """
original_order = model.objects.value_list('id', flat=True).order_by('order')
order = filter(lambda x: x[1]!=x[2], zip(xrange(len(order)), order, original_order))
for i in order:
model.objects.filter(id=i[1]).update(order=i[0])
cách tiếp cận khác, tùy thuộc vào những gì bạn đang làm là để làm một bản cập nhật phần (ví dụ sử dụng AJAX) nếu có thể, thay vì cập nhật toàn bộ tập hợp được sắp xếp lại, chỉ cần cập nhật từng cập nhật riêng biệt. Điều này thường sẽ làm tăng tổng tải, nhưng sẽ lan rộng theo thời gian. Lấy ví dụ như di chuyển phần tử thứ 5 theo từng bước để đặt 2, điều này sẽ giới thiệu 3 hoán đổi: (5,4); (4,3); (3.2). Kết quả trong 6 cập nhật, trong khi với cách tiếp cận tất cả-trong-một lần chỉ có 4 sẽ là cần thiết. Nhưng các hoạt động nhỏ sẽ được trải rộng theo thời gian.
Đoán nó chỉ lưu nhấn db một lần để có được tất cả các mục (tất cả các mục phải được cập nhật, vì vậy giải pháp của bạn cũng lặp trên tất cả chúng). –