Một vài lần tôi gặp phải tình huống, khi tiết kiệm thời gian, tôi cần phải biết trường nào sẽ được cập nhật và hành động tương ứng.Theo dõi các thay đổi kể từ lần lưu cuối cùng trong các mô hình django
Các giải pháp rõ ràng nhất cho điều này là để có những trường tiểu học trọng và lấy một bản sao của mô hình từ cơ sở dữ liệu:
class MyModel(models.Model):
def save(self, force_insert=False, force_update=False, using=None):
if self.id is not None:
unsaved_copy = MyModel.objects.get(id=self.id)
# Do your comparisons here
super(MyModel, self).save(force_insert, force_update, using)
đó làm việc hoàn toàn tốt đẹp, tuy nhiên, nó chạm vào cơ sở dữ liệu cho mỗi thể hiện của mô hình bạn đang tiết kiệm (có thể khá bất tiện nếu bạn đang thực hiện rất nhiều lần lưu). Rõ ràng, nếu người ta có thể "nhớ" các giá trị trường cũ khi bắt đầu tuổi thọ của cá thể mô hình (__init__
), sẽ không cần phải lấy một bản sao của mô hình từ cơ sở dữ liệu. Vì vậy, tôi đã đưa ra ít hack này:
class MyModel(models.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
self.unsaved = {}
for field in self._meta.fields:
self.unsaved[field.name] = getattr(self, field.name, None)
def save(self, force_insert=False, force_update=False, using=None):
for name, value in self.unsaved.iteritems():
print "Field:%s Old:%s New:%s" % (name, value, getattr(self, name, None))
# old values can be accessed through the self.unsaved member
super(MyModel, self).save(force_insert, force_update, using)
Điều này dường như hoạt động, tuy nhiên nó sử dụng giao diện ngoài công cộng django.db.models.Model
.
Có lẽ ai đó biết cách làm sạch hơn?
Không, tôi đã không hỏi nó trong bối cảnh của các mẫu quản trị viên, tuy nhiên tôi sẽ kiểm tra cách nó được thực hiện ở đó, cảm ơn cho tip. – shylent