I have this serializer:
class LoadEditSerializer(serializers.ModelSerializer):
loaddelivery = LoadDeliverySerializer(many=True, required=False)
loadpickup = LoadPickupSerializer(many=True, required=False)
loadfiles = LoadFilesSerializer(many=True, required=False)
loaddrivers = LoadDriversSerializer(many=True, required=False)
class Meta:
model = Loads
exclude = (
"id",
"created_by",
"updated_by",
)
def update(self, instance, validated_data):
loaddelivery_data = validated_data.pop('loaddelivery', [])
loadpickup_data = validated_data.pop('loadpickup', [])
loadfiles_data = validated_data.pop('loadfiles', [])
loaddrivers_data = validated_data.pop('loaddrivers', [])
# Update or create related objects
self.update_or_create_related_objects(instance, 'loaddelivery', loaddelivery_data)
self.update_or_create_related_objects(instance, 'loadpickup', loadpickup_data)
self.update_or_create_related_objects(instance, 'loadfiles', loadfiles_data)
self.update_or_create_related_objects(instance, 'loaddrivers', loaddrivers_data)
# Update instance fields
instance = super().update(instance, validated_data)
return instance
def update_or_create_related_objects(self, instance, related_name, related_data):
related_data = related_data if related_data is not None else []
related_model = getattr(instance, related_name).model
related_field_name = related_model._meta.get_field('load_key').name
# Create or update related objects
for data in related_data:
obj_id = data.pop('id', None) # Remove 'id' field from data
defaults = {related_field_name: instance, **data}
related_model.objects.update_or_create(id=obj_id, defaults=defaults)
To visualize the data, it looks like this:
{
"loaddelivery": [
{
"id": 1,
"field1": "value1",
"field2": "value2"
},
{
"id": 2,
"field1": "new_value1",
"field2": "new_value2"
}
],
"loadpickup": [
{
"field3": "value3",
"field4": "value4"
}
],
"loaddeductions": [],
"loadadditions": [
{
"field5": "value5"
}
],
"loadfiles": [],
"loaddrivers": [
{
"field6": "value6"
},
{
"field7": "value7"
}
]
}
and I got this requirements for these nested serializers:
if I send this objects without id, then we gotta create new one:
"loadadditions":[{"addition":"tester","price":"5.00"}]
if I send with id, then it has to be updated:
"loadadditions":[{"id": 1, "addition":"tester","price":"5.00"}]
if I have 3 data and send 2, it means that I have to delete non-including instance:
For example I had this:
"loadadditions":[ {"id": 1, "addition":"tester","price":"5.00"}, {"id": 2, "addition":"tester","price":"5.00"} ]
and if I sent this:
"loadadditions":[ {"id": 2, "addition":"tester","price":"5.00"} ]
it means that I deleted instance with id 1.
how can I manage all this here?
Hope I described it correctly