<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def upsert(manager, defaults=None, updates=None, **kwargs):
 """ Performs an update on an object or an insert if the object does not exist. :type defaults: dict :param defaults: These values are set when the object is created, but are irrelevant when the object already exists. This field should only be used when values only need to be set during creation. :type updates: dict :param updates: These values are updated when the object is updated. They also override any values provided in the defaults when inserting the object. :param kwargs: These values provide the arguments used when checking for the existence of the object. They are used in a similar manner to Django's get_or_create function. :returns: A tuple of the upserted object and a Boolean that is True if it was created (False otherwise) Examples: .. code-block:: python # Upsert a test model with an int value of 1. Use default values that will be given to it when created model_obj, created = upsert(TestModel.objects, int_field=1, defaults={'float_field': 2.0}) print(created) True print(model_obj.int_field, model_obj.float_field) 1, 2.0 # Do an upsert on that same model with different default fields. Since it already exists, the defaults # are not used model_obj, created = upsert(TestModel.objects, int_field=1, defaults={'float_field': 3.0}) print(created) False print(model_obj.int_field, model_obj.float_field) 1, 2.0 # In order to update the float field in an existing object, use the updates dictionary model_obj, created = upsert(TestModel.objects, int_field=1, updates={'float_field': 3.0}) print(created) False print(model_obj.int_field, model_obj.float_field) 1, 3.0 # You can use updates on a newly created object that will also be used as initial values. model_obj, created = upsert(TestModel.objects, int_field=2, updates={'float_field': 4.0}) print(created) True print(model_obj.int_field, model_obj.float_field) 2, 4.0 """

    defaults = defaults or {}
    # Override any defaults with updates
    defaults.update(updates or {})

    # Do a get or create
    obj, created = manager.get_or_create(defaults=defaults, **kwargs)

    # Update any necessary fields
    if updates is not None and not created and any(getattr(obj, k) != updates[k] for k in updates):
        for k, v in updates.items():
            setattr(obj, k, v)
        obj.save(update_fields=updates)

    return obj, created