jezeli chcesz taki adapter sobie zostawic to ok

ale tu trzeba ewidentnie wskazać gdzie te preview moze wylądować (albo w katalogu teams albo w users) - a to po to aby ktoś w przyszłości kto będzie czytał ten kod i dorabiał funkcionalnosc mogl sie skapnać jakie są możliwe destination i czym jest magiczny parametr img.
Proponuje:

niech swap_avatar przyjmuje type i id

jako property klasy dodać DESTINATIONS = { 
'users' : 'users',
'teams': 'teams',
)

i wtedy zrobić 
directory = self.DESTINATIONS[type]