nested serializer data manipulation

15 views Asked by At

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

0

There are 0 answers