On Wed, Mar 11, 2009 at 10:32 AM, koranthala <[email protected]> wrote:
>
> Hi,
> I have created an Identity Mapper for my website - which is as
> follows:
>
> class IdentityMap(object):
> def __getattr__(self, name):
> if not hasattr(self, name):
> setattr(self, name, {})
> return getattr(self, name)
>
>
> MAP = IdentityMap()
>
> class MapManager(models.Manager):
> def get(self, *args, **kwargs):
> if kwargs.has_key('mapname'):
> parm = kwargs.pop('mapname')
> dval = getattr(MAP, self.model.__name__)
> if not dval.has_key(parm):
> dval[parm] = super(MapManager, self).get(*args,
> **kwargs)
> return dval[parm]
> else:
> return super(MapManager, self).get(*args, **kwargs)
>
> #Model which is overriden by all models
> class BaseModel(models.Model):
> objects = MapManager()
>
> class Meta:
> abstract = True
>
>
> #--------------------------------------------------------------------------------
> #
> Everytime a get is issued (due to lazy loading I did not implement the
> same for filter), it first checks whether the given mapname is already
> stored inside MAP, and if not only then will it issue a proper get.
> Mapname is given by the user - he can give any unique name to it.
>
> Now, I wanted to do it for all models. Since User is part of
> django.auth, I overrode User too as given below.
>
> from django.contrib.auth.models import User, UserManager
>
> class MyUserManager(UserManager):
> def get(self, *args, **kwargs):
> if kwargs.has_key('mapname'):
> parm = kwargs.pop('mapname')
> dval = getattr(MAP, self.model.__name__)
> if not dval.has_key(parm):
> dval[parm] = super(MyUserManager, self).get(*args,
> **kwargs)
> return dval[parm]
> else:
> return super(MyUserManager, self).get(*args, **kwargs)
>
> class MyUser(User):
> objects = MyUserManager()
>
> class Meta:
> abstract = True
>
>
> #--------------------------------------------------------------------------------
> #
>
> But when I issued a get on MyUser, it is failing with the following
> error
>
> File "C:\django\My\..\My\test\test.py", line 164, in UserData
> data.save(form)
> File "C:\django\My\..\My\test\models.py", line 361, in save
> self.user = MyUser.objects.find(form.cleaned_data['user'],
> username=form.cleaned_data['user'])
> File "C:\django\My\..\My\test\models.py", line 93, in find
> dval[parm] = self.get(*args, **kwargs)
> File "C:\Python24\Lib\site-packages\django\db\models\manager.py",
> line 93, in get
> return self.get_query_set().get(*args, **kwargs)
> File "C:\Python24\Lib\site-packages\django\db\models\query.py", line
> 337, in get
> num = len(clone)
> File "C:\Python24\Lib\site-packages\django\db\models\query.py", line
> 161, in __len__
> self._result_cache = list(self.iterator())
> File "C:\Python24\Lib\site-packages\django\db\models\query.py", line
> 281, in iterator
> for row in self.query.results_iter():
> File "C:\Python24\Lib\site-packages\django\db\models\sql\query.py",
> line 254, in results_iter
> for rows in self.execute_sql(MULTI):
> File "C:\Python24\Lib\site-packages\django\db\models\sql\query.py",
> line 2011, in execute_sql
> sql, params = self.as_sql()
> File "C:\Python24\Lib\site-packages\django\db\models\sql\query.py",
> line 362, in as_sql
> out_cols = self.get_columns(with_col_aliases)
> File "C:\Python24\Lib\site-packages\django\db\models\sql\query.py",
> line 588, in get_columns
> col_aliases)
> File "C:\Python24\Lib\site-packages\django\db\models\sql\query.py",
> line 633, in get_default_columns
> root_pk = opts.pk.column
> AttributeError: 'NoneType' object has no attribute 'column'
>
> I even tried changing the metaclass, but it does not seem to have any
> effect.
> Can someone help me out?
> >
>
There was a feature just implemented in the development version that is
perfect for this.
http://docs.djangoproject.com/en/dev/ref/models/options/#managed
Alex
--
"I disapprove of what you say, but I will defend to the death your right to
say it." --Voltaire
"The people's good is the highest law."--Cicero
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---