@@ -105,16 +105,25 @@ class PrimaryKeyComparator(BaseComparator):
105105 primary_key_fields = ['pk' ]
106106 normalization_functions = {}
107107
108- def _have_field_equal (self , obj1 , obj2 , field ):
108+ def _get_compared_objects_at_field_path (self , obj1 , obj2 , field ):
109109 key_path = tuple (k for k in field .split ('.' ) if k )
110110 o1 = get_obj_at_key_path (obj1 , key_path , NOTHING )
111111 o2 = get_obj_at_key_path (obj2 , key_path , NOTHING )
112+ return o1 , o2
113+
114+ def _have_field_equal (self , obj1 , obj2 , field ):
115+ o1 , o2 = self ._get_compared_objects_at_field_path (obj1 , obj2 , field )
112116 if o1 == NOTHING or o2 == NOTHING :
113117 return False
114118
115119 fn = self .normalization_functions .get (field , lambda x : x )
116120 return fn (o1 ) == fn (o2 )
117121
122+ def _are_fields_nothing (self , obj1 , obj2 , field ):
123+ o1 , o2 = self ._get_compared_objects_at_field_path (obj1 , obj2 , field )
124+ if o1 == NOTHING or o2 == NOTHING :
125+ return True
126+
118127 def equal (self , obj1 , obj2 ):
119128 if obj1 == obj2 :
120129 return True
@@ -124,7 +133,11 @@ def equal(self, obj1, obj2):
124133 field_set = [field_set ]
125134 checks = [self ._have_field_equal (obj1 , obj2 , field )
126135 for field in field_set ]
127- if all (checks ):
136+ are_all_fields_nothing = [
137+ self ._are_fields_nothing (obj1 , obj2 , field )
138+ for field in field_set
139+ ]
140+ if all (checks ) and not all (are_all_fields_nothing ):
128141 return True
129142
130143 return False
0 commit comments