How to efficiently update nested objects in Django Serializer

Viewed 76

I have been doing some research but couldn't find an effective yet simple way to update instances without making some repetitive code. Here is an example:

PartySerializer(Model.serializers)

def update(self, instance, validated_data):
    instance.name = validated_data.get('name', instance.name)
    instance.event_date = validated_data.get('event_date', instance.event_date)
    instance.time_start = validated_data.get('time_start', instance.time_start)
    instance.time_end = validated_data.get('time_end', instance.time_end)
    instance.main_color = validated_data.get('main_color', instance.main_color)
    instance.is_age_limited = validated_data.get('is_age_limited', instance.is_age_limited)
    instance.is_open_bar = validated_data.get('is_open_bar', instance.is_open_bar)
    instance.is_open_food = validated_data.get('is_open_food', instance.is_open_food)
    instance.description = validated_data.get('description', instance.description)
    instance.location = validated_data.get('location', instance.location)
    instance.category = validated_data.get('category', instance.category)
    instance.save()

Is there any cleaner and more efficient approach ?

1 Answers

Guys I finally found a better way of doing this. @Neeraj as i am using nested objects I need to specify an override for method update. So when I use super() I end up calling the same function I am in. @VJ Magar I am not doing a partial update in this case, all fields are present at least its key. My solution was this:

def update(self, instance, validated_data):
    for key, obj in validated_data.items():
        if not key == 'location':
            setattr(instance, key, obj)
        else:
            location_serializer = LocationSerializer(instance.location, data=validated_data.get('location'))
            if location_serializer.is_valid():
                location_serializer.save()
    instance.save()
    return instance
Related