Hi,

what's the right way to detemine what changed on an object? I use
ext.declarative and mapper extension, which calls code in the end of message
after_insert and before_update. It skips M2M relations because .get_history()
call loads everything in memory.

Is there better way to determine what's going to be stored in database?

def modifications(obj):
    '''Return dictionary of changes in object.

    No modifications are visible after saving object.

    Parameters:

      obj - object itself

    Output dictionary:

      keys - object attributes which are changed
      values - 2-tuple of changes in format (from, to)
    '''
    state = orm.attributes.instance_state(obj)
    dict_ = state.dict
    changes = {}
    # copying fixes "RuntimeError: dictionary changed size during iteration"
    for attr in list(state.manager.attributes):
        if not hasattr(attr.impl, 'get_history'):
            continue
        # we don't want those because they can fetch a lot of objects in memory
        # ONETOMANY == backreference to foreign key
        if (isinstance(attr.property, orm.properties.RelationProperty) and
            attr.property.direction in (ONETOMANY, MANYTOMANY)):
            continue
        key = attr.impl.key
        try:
            added, unchanged, deleted = attr.impl.get_history(state, dict_)
        except ValueError, e:
            changes[key] = {'error': str(e),
                            'descr': 'possibly backreference of m2m relation'}
        else:
            if added or deleted:
                if deleted != added:
                    changes[key] = map(modeltorepr, deleted), map(modeltorepr, 
added)
    return changes



This works, but there is a problem - if attr is a backreference

-- 
Alexander

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to