@@ -41,14 +41,19 @@ def serialize_model_instance(
4141 """Serializes Django model instance to dictionary"""
4242 out = {}
4343 for field in obj ._meta .get_fields ():
44- if self .is_one_relationship (field ):
45- out .update (self .serialize_foreign_key (obj , field , referrers + (obj ,)))
44+ if self .show_field (obj , field .name ):
45+ if self .is_one_relationship (field ):
46+ out .update (
47+ self .serialize_foreign_key (obj , field , referrers + (obj ,))
48+ )
4649
47- elif self .is_many_relationship (field ):
48- out .update (self .serialize_many_relationship (obj , referrers + (obj ,)))
50+ elif self .is_many_relationship (field ):
51+ out .update (
52+ self .serialize_many_relationship (obj , referrers + (obj ,))
53+ )
4954
50- else :
51- out .update (self .serialize_value_field (obj , field ))
55+ else :
56+ out .update (self .serialize_value_field (obj , field ))
5257 return out
5358
5459 def serialize_queryset (
@@ -73,9 +78,8 @@ def serialize_foreign_key(
7378 except Exception as exc : # pragma: no cover
7479 logger .error (f"serialize_foreign_key error - { obj } " , exc_info = exc )
7580 return {field .name : None }
76- if hasattr (obj , "__Meta" ) and getattr (obj , "__Meta" ).get (
77- "model_recursive" , False
78- ):
81+
82+ if self .get_configuration (obj , "model_recursive" , default = False ):
7983 return {
8084 field .name : self .serialize_model_instance (related_instance , referrers )
8185 }
@@ -94,9 +98,7 @@ def serialize_many_relationship(
9498 for k , v in obj ._prefetched_objects_cache .items (): # type: ignore
9599 field_name = k if hasattr (obj , k ) else k + "_set"
96100 if v :
97- if hasattr (obj , "__Meta" ) and getattr (obj , "__Meta" ).get (
98- "model_join" , True
99- ):
101+ if self .get_configuration (obj , "model_join" , default = True ):
100102 out [field_name ] = self .serialize_queryset (v , referrers + (obj ,))
101103 else :
102104 out [field_name ] = [o .pk for o in v ]
@@ -107,20 +109,59 @@ def serialize_many_relationship(
107109 return out
108110
109111 @staticmethod
110- def serialize_value_field (obj : models .Model , field : Any ) -> Dict [Any , Any ]:
112+ def get_configuration (obj : models .Model , _name : str , default : Any = None ) -> Any :
113+ _value = default if default else None
114+ if hasattr (obj , "__Meta" ):
115+ _value = getattr (obj , "__Meta" ).get (_name , None )
116+ return _value
117+
118+ def get_model_fields_list (self , obj : models .Model ) -> Any :
119+ model_fields = self .get_configuration (obj , "model_fields" )
120+ return model_fields
121+
122+ def get_model_exclude_list (self , obj : models .Model ) -> Any :
123+ return self .get_configuration (obj , "model_exclude" )
124+
125+ def get_sensitive_list (self , obj : models .Model ) -> Any :
126+ return self .get_configuration (obj , "sensitive_fields" )
127+
128+ def get_final_excluded_list (self , obj : models .Model ) -> Any :
129+ total_excluded_list = []
130+ sensitive_list : List = ["password" , "token" ]
131+ excluded_list = []
132+
133+ sensitive_fields = self .get_sensitive_list (obj )
134+ if sensitive_fields :
135+ sensitive_list .extend (sensitive_fields )
136+ sensitive_list = list (set (sensitive_list ))
137+
138+ excluded_fields = self .get_model_exclude_list (obj )
139+ if excluded_fields :
140+ excluded_list .extend (excluded_fields )
141+ excluded_list = list (set (excluded_list ))
142+
143+ total_excluded_list .extend (sensitive_list )
144+ total_excluded_list .extend (excluded_list )
145+ return list (set (total_excluded_list ))
146+
147+ def show_field (self , obj : models .Model , field_name : str ) -> bool :
148+ model_exclude_list = self .get_model_exclude_list (obj )
149+ if model_exclude_list :
150+ if field_name in self .get_final_excluded_list (obj ):
151+ return False
152+ else :
153+ if field_name in self .get_final_excluded_list (obj ):
154+ return False
155+ model_fields_list = self .get_model_fields_list (obj )
156+ if model_fields_list != "__all__" :
157+ if field_name not in model_fields_list :
158+ return False
159+ return True
160+
161+ def serialize_value_field (self , obj : models .Model , field : Any ) -> Dict [Any , Any ]:
111162 """
112163 Serializes regular 'jsonable' field (Char, Int, etc.) of Django model instance
113164 """
114- sensitive_list : List = [
115- "password" ,
116- ]
117- if hasattr (obj , "__Meta" ):
118- sensitive_fields = getattr (obj , "__Meta" ).get ("sensitive_fields" , None )
119- if sensitive_fields :
120- sensitive_list .extend (sensitive_fields )
121- sensitive_list = list (set (sensitive_list ))
122- if field .name in sensitive_list :
123- return {}
124165 return {field .name : getattr (obj , field .name )}
125166
126167 def serialize_data (self , data : Any ) -> Any :
0 commit comments