Ý tưởng trên
updated = Entry.objects.filter(Q(id=e.id) && Q(version=e.version))\
.update(updated_field=new_value, version=e.version+1)
if not updated:
raise ConcurrentModificationException()
trông tuyệt vời và sẽ hoạt động tốt ngay cả khi không có các giao dịch có thể tuần tự hóa.
Vấn đề là làm thế nào để tăng cường hành vi deafult .save () để không phải làm hệ thống ống nước thủ công để gọi phương thức .update ().
Tôi đã xem xét ý tưởng Trình quản lý tùy chỉnh.
Kế hoạch của tôi là ghi đè phương thức Manager _update được Model.save_base () gọi để thực hiện cập nhật.
Đây là mã hiện tại trong Django 1.3
def _update(self, values, **kwargs):
return self.get_query_set()._update(values, **kwargs)
Những gì cần làm IMHO là những việc như:
def _update(self, values, **kwargs):
v = self.get_version_field_value(values[0])
return self.get_query_set().filter(Q(version=v))._update(values, **kwargs)
Điều tương tự cần xảy ra khi xóa. Tuy nhiên, việc xóa khó hơn một chút vì Django đang triển khai khá nhiều voodoo trong lĩnh vực này thông qua django.db.models.deletion.Collector.
Thật kỳ lạ khi công cụ modren như Django thiếu hướng dẫn cho Kiểm soát sự đồng bộ tối ưu.
Tôi sẽ cập nhật bài đăng này khi tôi giải được câu đố. Hy vọng rằng giải pháp sẽ theo một cách tốt đẹp mà không liên quan đến hàng tấn mã hóa, chế độ xem kỳ lạ, bỏ qua các phần thiết yếu của Django, v.v.