1+ import copy
12import typing
23
34from core .models import BaseAbstractModel , BaseAbstractModelQuerySet
@@ -58,21 +59,38 @@ class Meta:
5859 def __str__ (self ) -> str :
5960 return str (self .instance )
6061
61- def apply_modification (self , save : bool = False ) -> models .Model :
62+ def join_modification_data (self , data : dict ) -> dict :
63+ new_data : dict [str , typing .Any ] = copy .deepcopy (self .modification_data )
64+ for field , orig_value in data .items ():
65+ if not (mod_data := self .modification_data .get (field )):
66+ continue
67+
68+ if isinstance (orig_value , list ):
69+ sub_mod_value_map : dict [str , typing .Any ] = {v ["id" ]: v for v in mod_data }
70+ new_value = []
71+ for orig_sub_value in orig_value [field ]:
72+ if not isinstance (orig_sub_value , dict ) or not (sub_value_id := orig_sub_value .get ("id" )):
73+ continue
74+
75+ new_value .append (orig_sub_value | sub_mod_value_map .get (sub_value_id , {}))
76+
77+ new_data [field ] = new_value
78+ elif isinstance (orig_value , dict ):
79+ # One to One case
80+ new_data [field ] = orig_value | mod_data
81+ else :
82+ # 일반 필드 업데이트
83+ new_data [field ] = mod_data
84+
85+ return new_data
86+
87+ def apply_modification (self ) -> models .Model :
6288 for field , value in self .modification_data .items ():
6389 if isinstance (value , list ):
6490 # One to Many case
65- sub_value_map = {sub_value ["id" ]: sub_value for sub_value in value }
66- if not (sub_instances := list (getattr (self .instance , field ).filter (pk__in = sub_value_map ))):
67- continue
68-
69- for sub_instance in sub_instances :
70- sub_data = sub_value_map [str (sub_instance .pk )]
71- for sub_field , sub_value in sub_data .items ():
72- setattr (sub_instance , sub_field , sub_value )
91+ for sub_value in value :
92+ getattr (self .instance , field ).filter (pk = sub_value .pop ("id" )).update (** sub_value )
7393
74- if save :
75- sub_instance .save ()
7694 elif isinstance (value , dict ):
7795 # One to One case
7896 if not (sub_instance := getattr (self .instance , field , None )):
@@ -81,16 +99,12 @@ def apply_modification(self, save: bool = False) -> models.Model:
8199 for sub_field , sub_value in value .items ():
82100 setattr (sub_instance , sub_field , sub_value )
83101
84- if save :
85- sub_instance .save ()
86- else :
87- setattr (self .instance , field , sub_instance )
102+ sub_instance .save ()
88103 else :
89104 # 일반 필드 업데이트
90105 setattr (self .instance , field , value )
91106
92- if save :
93- self .instance .save ()
107+ self .instance .save ()
94108
95109 return self .instance
96110
0 commit comments