Sửa đổi câu trả lời ở trên ... tham gia các chức năng rực rỡ từ Dominik Szopa và thay đổi nó sẽ giải quyết phát hiện sự thay đổi mối quan hệ của bạn: Sử dụng này:
def get_changes_between_models(model1, model2, excludes = []):
changes = {}
for field in model1._meta.fields:
if not (field.name in excludes):
if field.value_from_object(model1) != field.value_from_object(model2):
changes[field.verbose_name] = (field.value_from_object(model1),
field.value_from_object(model2))
return changes
Sau đó trong mã của bạn, bạn có thể nói (tránh try/trừ vì lý do hiệu suất):
if (self.id):
old = MyModel.Objects.get(pk=self.id)
changes = get_changes_between_models(self, old)
if (changes):
# Process based on what is changed.
Nếu bạn đang làm điều này ở cấp "mô hình", không có cách nào để lưu truy vấn bổ sung. Dữ liệu đã được thay đổi khi bạn đạt đến điểm "Lưu". Bài đăng đầu tiên của tôi, vì vậy hãy tha thứ cho tôi nếu tôi nghe như một thằng ngốc.
Cảm ơn bạn đã biết mẹo về 'Field.value_from_object()'! Rõ ràng nó cung cấp một cách nhất quán so sánh các giá trị. Tốt đẹp! –
Để làm cho câu trả lời này dễ đọc hơn, chính xác và rõ ràng hơn, tôi sẽ thay đổi "model1" thành "model_instance_1" và "model2" thành "model_instance_2". Và tên phương thức có lẽ là "get_changes_between_model_instances". Không chắc chắn nếu có một cách tốt hơn trong các phiên bản gần đây của django nhưng tôi đang sử dụng 1.8 hiện tại và câu trả lời này sẽ làm việc cho tôi. – jenniwren