@@ -41,6 +41,51 @@ class Meta:
4141 )
4242
4343
44+ def _model_to_jsonable_dict (instance : models .Model , new_data : dict ) -> dict [str , str | None ]:
45+ """모델 인스턴스를 JSON 직렬화 가능한 딕셔너리로 변환합니다."""
46+ if not instance :
47+ return {}
48+
49+ data : dict [str , str | None ] = {}
50+ for field , value in new_data .items ():
51+ if not hasattr (instance , field ):
52+ continue
53+
54+ if isinstance (value , list ):
55+ sub_data = []
56+
57+ for sub_value in value :
58+ # One to Many case
59+ if not isinstance (sub_value , dict ) or "id" not in sub_value :
60+ continue
61+ sub_qs = getattr (instance , field , None )
62+ if not isinstance (sub_qs , models .manager .BaseManager ):
63+ continue
64+ if not (sub_instance := sub_qs .filter (pk = sub_value ["id" ]).first ()):
65+ continue
66+
67+ sub_data .append (_model_to_jsonable_dict (sub_instance , sub_value ))
68+
69+ if sub_data :
70+ data [field ] = sub_data
71+
72+ elif isinstance (value , dict ):
73+ # One to One case
74+ if not (sub_instance := getattr (instance , field , None )):
75+ continue
76+
77+ data [field ] = _model_to_jsonable_dict (sub_instance , value )
78+
79+ elif getattr (instance , field ) != value :
80+ if isinstance (value , models .Model ):
81+ field = f"{ getattr (instance ._meta .model , field ).field .name } _id"
82+ value = str (value .pk )
83+
84+ data [field ] = value
85+
86+ return data
87+
88+
4489class ModificationAuditCreationPortalSerializer (serializers .ModelSerializer ):
4590 has_requested_modification_audit = serializers .SerializerMethodField ()
4691 requested_modification_audit_id = serializers .SerializerMethodField ()
@@ -76,29 +121,16 @@ def validate(self, attrs: dict) -> dict:
76121 "Please cancel the existing request and try again."
77122 )
78123
79- modification_data : dict [str , str | None ] = {}
80- for field , value in attrs .items ():
81- if hasattr (self .instance , field ) and getattr (self .instance , field ) != value :
82- if isinstance (value , models .Model ):
83- field = f"{ getattr (self .instance ._meta .model , field ).field .name } _id"
84- value = str (value .pk )
85-
86- modification_data [field ] = value
87-
88- if not modification_data :
124+ if not (modification_data := _model_to_jsonable_dict (self .instance , attrs )):
89125 raise serializers .ValidationError ("변경된 데이터가 없습니다.\n No modification data provided." )
90126
91127 return modification_data
92128
93129 def save (self , ** kwargs : dict ) -> models .Model :
94130 """instance.save()를 호출하는 대신, 변경된 데이터를 추출하여 ModificationAudit 인스턴스를 생성합니다."""
95- ModificationAudit .objects .create (instance = self .instance , modification_data = self .validated_data )
96-
97- for field , value in self .validated_data .items ():
98- if hasattr (self .instance , field ):
99- setattr (self .instance , field , value )
100-
101- return self .instance
131+ return ModificationAudit .objects .create (
132+ instance = self .instance , modification_data = self .validated_data
133+ ).apply_modification (save = False )
102134
103135
104136class ModificationAuditCancelPortalSerializer (serializers .ModelSerializer ):
0 commit comments