'Function that can be curried to provide the source accessor or DB column name for the m2m table'

def _get_m2m_attr(self, related, attr):

    cache_attr = ('_m2m_%s_cache' % attr)
    if hasattr(self, cache_attr):
        return getattr(self, cache_attr)
    for f in self.rel.through._meta.fields:
        if (hasattr(f, 'rel') and f.rel and (f.rel.to == related.model)):
            setattr(self, cache_attr, getattr(f, attr))
            return getattr(self, cache_attr)
