@@ -36,11 +36,15 @@ class HistoricalRecords(object):
36
36
thread = threading .local ()
37
37
38
38
def __init__ (self , verbose_name = None , bases = (models .Model ,),
39
- user_related_name = '+' , table_name = None , inherit = False ):
39
+ user_related_name = '+' , table_name = None , inherit = False ,
40
+ excluded_fields = None ):
40
41
self .user_set_verbose_name = verbose_name
41
42
self .user_related_name = user_related_name
42
43
self .table_name = table_name
43
44
self .inherit = inherit
45
+ if excluded_fields is None :
46
+ excluded_fields = []
47
+ self .excluded_fields = excluded_fields
44
48
try :
45
49
if isinstance (bases , six .string_types ):
46
50
raise TypeError
@@ -134,13 +138,20 @@ def create_history_model(self, model):
134
138
return python_2_unicode_compatible (
135
139
type (str (name ), self .bases , attrs ))
136
140
141
+ def fields_included (self , model ):
142
+ fields = []
143
+ for field in model ._meta .fields :
144
+ if field .name not in self .excluded_fields :
145
+ fields .append (field )
146
+ return fields
147
+
137
148
def copy_fields (self , model ):
138
149
"""
139
150
Creates copies of the model's original fields, returning
140
151
a dictionary mapping field name to copied field object.
141
152
"""
142
153
fields = {}
143
- for field in model . _meta . fields :
154
+ for field in self . fields_included ( model ) :
144
155
field = copy .copy (field )
145
156
try :
146
157
field .remote_field = copy .copy (field .remote_field )
@@ -212,7 +223,7 @@ def get_instance(self):
212
223
('~' , _ ('Changed' )),
213
224
('-' , _ ('Deleted' )),
214
225
)),
215
- 'history_object' : HistoricalObjectDescriptor (model ),
226
+ 'history_object' : HistoricalObjectDescriptor (model , self . fields_included ( model ) ),
216
227
'instance' : property (get_instance ),
217
228
'instance_type' : model ,
218
229
'revert_url' : revert_url ,
@@ -252,7 +263,7 @@ def create_historical_record(self, instance, history_type):
252
263
history_change_reason = getattr (instance , 'changeReason' , None )
253
264
manager = getattr (instance , self .manager_name )
254
265
attrs = {}
255
- for field in instance . _meta . fields :
266
+ for field in self . fields_included ( instance ) :
256
267
attrs [field .attname ] = getattr (instance , field .attname )
257
268
manager .create (history_date = history_date , history_type = history_type ,
258
269
history_user = history_user ,
@@ -308,10 +319,11 @@ def convert_auto_field(field):
308
319
309
320
310
321
class HistoricalObjectDescriptor (object ):
311
- def __init__ (self , model ):
322
+ def __init__ (self , model , fields_included ):
312
323
self .model = model
324
+ self .fields_included = fields_included
313
325
314
326
def __get__ (self , instance , owner ):
315
327
values = (getattr (instance , f .attname )
316
- for f in self .model . _meta . fields )
328
+ for f in self .fields_included )
317
329
return self .model (* values )
0 commit comments