@@ -154,13 +154,39 @@ def create(self, validated_data):
154154 return operation_tree
155155
156156
157+ class ReferenceQuantitySerializer (serializers .ModelSerializer ):
158+ derived_quantity = serializers .PrimaryKeyRelatedField (
159+ queryset = models .Quantity , required = False
160+ )
161+
162+ class Meta :
163+ model = models .ReferenceQuantity
164+ fields = ["value" , "variance" , "units" , "hash" , "derived_quantity" ]
165+
166+ def to_representation (self , instance ):
167+ data = super ().to_representation (instance )
168+ if "derived_quantity" in data :
169+ data .pop ("derived_quantity" )
170+ return data
171+
172+ def create (self , validated_data ):
173+ derived_quantity = models .Quantity .objects .get (
174+ id = validated_data .pop ("derived_quantity" )
175+ )
176+ if "label" in validated_data :
177+ validated_data .pop ("label" )
178+ if "history" in validated_data :
179+ validated_data .pop ("history" )
180+ return models .ReferenceQuantity .objects .create (
181+ derived_quantity = derived_quantity , ** validated_data
182+ )
183+
184+
157185class QuantitySerializer (serializers .ModelSerializer ):
158186 """Serialization, deserialization, and validation for the Quantity model."""
159187
160188 operation_tree = OperationTreeSerializer (read_only = False , required = False )
161- derived_quantity = serializers .PrimaryKeyRelatedField (
162- queryset = models .Quantity , required = False , allow_null = True
163- )
189+ references = ReferenceQuantitySerializer (many = True , read_only = False , required = False )
164190 label = serializers .CharField (max_length = 20 )
165191 dataset = serializers .PrimaryKeyRelatedField (
166192 queryset = models .DataSet , required = False , allow_null = True
@@ -178,14 +204,14 @@ class Meta:
178204 "references" ,
179205 "label" ,
180206 "dataset" ,
181- "derived_quantity" ,
182207 "history" ,
183208 ]
184209
185- def validate_references (self , value ):
186- for ref in value :
187- serializer = QuantitySerializer (data = ref )
188- serializer .is_valid (raise_exception = True )
210+ def validate_history (self , value ):
211+ if "references" in value :
212+ for ref in value ["references" ]:
213+ serializer = ReferenceQuantitySerializer (data = ref )
214+ serializer .is_valid (raise_exception = True )
189215
190216 # TODO: should variable-only history be assumed to refer to the same Quantity and ignored?
191217 # Extract operation tree from history
@@ -199,10 +225,11 @@ def to_internal_value(self, data):
199225 and not operations ["operation" ] == "variable"
200226 ):
201227 data_copy ["operation_tree" ] = operations
202- if "references" in data ["history" ]:
203- data_copy ["references" ] = data ["history" ]["references" ]
204- data_copy .pop ("history" )
205- return super ().to_internal_value (data_copy )
228+ return_data = super ().to_internal_value (data_copy )
229+ return_data ["history" ] = data ["history" ]
230+ return return_data
231+ else :
232+ return super ().to_internal_value (data_copy )
206233 return super ().to_internal_value (data )
207234
208235 # Serialize a Quantity instance
@@ -221,19 +248,14 @@ def to_representation(self, instance):
221248 def create (self , validated_data ):
222249 dataset = models .DataSet .objects .get (id = validated_data .pop ("dataset" ))
223250 operations_tree = None
224- derived_quantity = None
225251 references = None
226252 if "operation_tree" in validated_data :
227253 operations_tree = validated_data .pop ("operation_tree" )
228- if "derived_quantity" in validated_data :
229- derived_quantity = models .Quantity .objects .get (
230- id = validated_data .pop ("derived_quantity" )
231- )
232- if "references" in validated_data :
233- references = validated_data .pop ("references" )
234- quantity = models .Quantity .objects .create (
235- dataset = dataset , derived_quantity = derived_quantity , ** validated_data
236- )
254+ if "history" in validated_data :
255+ history = validated_data .pop ("history" )
256+ if history and "references" in history :
257+ references = history .pop ("references" )
258+ quantity = models .Quantity .objects .create (dataset = dataset , ** validated_data )
237259 if operations_tree :
238260 operations_tree ["quantity" ] = quantity .id
239261 OperationTreeSerializer .create (
@@ -242,7 +264,9 @@ def create(self, validated_data):
242264 if references :
243265 for ref in references :
244266 ref ["derived_quantity" ] = quantity .id
245- QuantitySerializer .create (QuantitySerializer (), validated_data = ref )
267+ ReferenceQuantitySerializer .create (
268+ ReferenceQuantitySerializer (), validated_data = ref
269+ )
246270 return quantity
247271
248272
0 commit comments