File tree Expand file tree Collapse file tree 2 files changed +22
-1
lines changed Expand file tree Collapse file tree 2 files changed +22
-1
lines changed Original file line number Diff line number Diff line change @@ -522,11 +522,15 @@ def __hash__(self):
522
522
return hash (self .pk )
523
523
524
524
def __reduce__ (self ):
525
- data = self .__dict__
525
+ data = self .__getstate__ ()
526
526
data [DJANGO_VERSION_PICKLE_KEY ] = get_version ()
527
527
class_id = self ._meta .app_label , self ._meta .object_name
528
528
return model_unpickle , (class_id ,), data
529
529
530
+ def __getstate__ (self ):
531
+ """Hook to allow choosing the attributes to pickle."""
532
+ return self .__dict__
533
+
530
534
def __setstate__ (self , state ):
531
535
msg = None
532
536
pickled_version = state .get (DJANGO_VERSION_PICKLE_KEY )
Original file line number Diff line number Diff line change @@ -43,3 +43,20 @@ def __reduce__(self):
43
43
msg = "Pickled model instance's Django version 1.0 does not match the current version %s." % get_version ()
44
44
with self .assertRaisesMessage (RuntimeWarning , msg ):
45
45
pickle .loads (pickle .dumps (p ))
46
+
47
+ def test_with_getstate (self ):
48
+ """
49
+ A model may override __getstate__() to choose the attributes to pickle.
50
+ """
51
+ class PickledModel (models .Model ):
52
+ def __getstate__ (self ):
53
+ state = super ().__getstate__ ().copy ()
54
+ del state ['dont_pickle' ]
55
+ return state
56
+
57
+ m = PickledModel ()
58
+ m .dont_pickle = 1
59
+ dumped = pickle .dumps (m )
60
+ self .assertEqual (m .dont_pickle , 1 )
61
+ reloaded = pickle .loads (dumped )
62
+ self .assertFalse (hasattr (reloaded , 'dont_pickle' ))
You can’t perform that action at this time.
0 commit comments