2009-07-17 35 views
11

Tôi thực sự thích tính năng của SQLAlchemy cho phép bạn xem một đối tượng có bị bẩn không: nếu nó đã được sửa đổi vì nó đã được lấy ra từ cơ sở dữ liệu, hoặc lần cuối cùng nó được lưu lại.Bạn có thể tìm hiểu xem một cá thể Mô hình Django có "bẩn" không?

Có thể tìm thông tin này từ ORM Django không?

Lưu ý điều này không giống như Dirty fields in django, vì tôi không quan tâm đến dữ liệu trước đó, mặc dù câu trả lời của S.Lott có thể cung cấp cách để thực hiện, nhưng tôi muốn một cách không kho dữ liệu.

Tôi cũng đã xem xét django.db.transaction.is_dirty(), nhưng điều này dường như không phải là giải pháp.

+0

câu hỏi không phải là quá khác nhau và các câu trả lời tương tự để http://stackoverflow.com/questions/110803/dirty-fields-in-django thể làm việc cho vấn đề của bạn – dnozay

+0

đây là cùng một loại câu trả lời như http://stackoverflow.com/a/332225/1733117 – dnozay

Trả lời

4

Một giải pháp mà không làm một truy vấn cơ sở dữ liệu:

class DirtyMixin(object): 
    @property 
    def is_dirty(self): 
     db_obj = self.__class__.objects.get(self.pk) 
     for f in self._meta.local_fields: 
      if self.__getattribute__(f.name) != db_obj.__getattribute__(f.name): 
       return True 
     return False 

Sau đó, bạn có thể thêm này như là một lớp tổ tiên để một mô hình. Hoặc, khỉ-vá lớp forms.Model, nếu bạn thích.

from django.db import models 
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__ 
+0

Sẽ không ném một ngoại lệ nếu mô hình chưa được lưu chưa? Có vẻ như vậy nên bị bắt và 'True' trở lại. –

+0

Vâng, đó có thể là sự giám sát. –

+0

AttributeError: đối tượng 'MyObject' không có thuộc tính 'get'. Bạn không có nghĩa là một cái gì đó như tự .__ class __. Objects.get (pk = self.pk)? – Julian

2

Một cách khác, liên quan đến trọng __setattr__, được thảo luận tại một số thời gian trong this Django ticket.

+0

Đây là một câu trả lời hay nhưng sẽ tốt hơn nếu nó bao gồm mã không chỉ là một liên kết. – poolie

1

thử sử dụng lck.django lớp TimeTrackable

+0

Tuyệt. Điều đó trông giống như một cách mạnh mẽ để làm điều đó. –

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