Hi,

the problem was with defining the managers on the Proxy model. As more 
recent docs say, managers should be defined separately:

https://docs.djangoproject.com/en/dev/topics/db/models/#proxy-model-managers

this is already fixed in zinnia 0.14.

On Wednesday, December 18, 2013 7:30:53 PM UTC+1, Aaron Spike wrote:
>
> I experienced some obscure test failures after integrating Zinnia with my 
> application. I've tracked it down to the behavior of Proxy Models and I'm 
> unable
> to rationalize the documentation with the behavior I see. Here's what I've 
> done
> to understand the issue:
>
> If I create an app with a Proxy Model for auth.User (using get_user_model):
>
>     # pm/models.py
>     # a stripped down copy of Zinnia's Author
>     from django.db import models
>     from django.contrib.auth import get_user_model
>
>     class MyUser(get_user_model()):
>         objects = get_user_model()._default_manager
>
>         def __str__(self):
>             return self.get_full_name() or self.get_username()
>
>         class Meta:
>             app_label = 'pm'
>             proxy = True
>
> I see the following behavior in the shell:
>
>     $ ./manage.py shell
>     Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
>     [GCC 4.7.3] on linux2
>     Type "help", "copyright", "credits" or "license" for more information.
>     (InteractiveConsole)
>     >>> from django.contrib.auth import get_user_model
>     >>> get_user_model()
>     <class 'django.contrib.auth.models.User'>
>     >>> get_user_model().objects.model
>     <class 'pm.models.MyUser'>
>     >>> get_user_model().objects.get(pk=1)
>     <MyUser: admin>
>     >>> 
>
> This seems to be contrary to the claim made in the documentation:
>
>     "QuerySets still return the model that was requested
>
>     There is no way to have Django return, say, a MyPerson object whenever 
> you 
>     query for Person objects. A queryset for Person objects will return 
> those 
>     types of objects. The whole point of proxy objects is that code 
> relying on 
>     the original Person will use those and your own code can use the 
> extensions 
>     you included (that no other code is relying on anyway). It is not a 
> way to 
>     replace the Person (or any other) model everywhere with something of 
> your 
>     own creation."
>     
>     
> https://docs.djangoproject.com/en/dev/topics/db/models/#querysets-still-return-the-model-that-was-requested
>
>
> If I create a second app and model with a Proxy for auth.User:
>
>     # pm2/models.py
>     from django.db import models
>     from django.contrib.auth import get_user_model
>
>     class MyUser2(get_user_model()):
>         objects = get_user_model()._default_manager
>
>         def __str__(self):
>             return self.get_full_name() or self.get_username()
>
>         class Meta:
>             app_label = 'pm2'
>             proxy = True
>         
> Then I get an AssertionError with the following traceback:
>         
>     $ ./manage.py shell --traceback
>     Traceback (most recent call last):
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/core/management/base.py",
>  
> line 222, in run_from_argv
>         self.execute(*args, **options.__dict__)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/core/management/base.py",
>  
> line 255, in execute
>         output = self.handle(*args, **options)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/core/management/base.py",
>  
> line 385, in handle
>         return self.handle_noargs(**options)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/core/management/commands/shell.py",
>  
> line 54, in handle_noargs
>         get_models()
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/db/models/loading.py",
>  
> line 197, in get_models
>         self._populate()
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/db/models/loading.py",
>  
> line 72, in _populate
>         self.load_app(app_name, True)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/db/models/loading.py",
>  
> line 96, in load_app
>         models = import_module('.models', app_name)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/utils/importlib.py",
>  
> line 35, in import_module
>         __import__(name)
>       File "~/src/django_proxy_model_test/pm/models.py", line 5, in 
> <module>
>         class MyUser(get_user_model()):
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/db/models/base.py",
>  
> line 134, in __new__
>         new_class._default_manager = 
> new_class._default_manager._copy_to_model(new_class)
>       File 
> "~/.virtualenvs/django_proxy_model_test/local/lib/python2.7/site-packages/django/db/models/manager.py",
>  
> line 95, in _copy_to_model
>         assert issubclass(model, self.model)
>     AssertionError
>
> After the first Proxy Model is registered, self.model points at the Proxy 
> Model 
> instead of the original Model. The second Proxy Model is not a subclass of 
> the 
> first.
>
> Is there a contradiction between the behavior I observe and the 
> documentation? 
> Or am I simply misunderstanding the documentation? Should it be possible 
> for a
> model to be proxied multiple times?
>
> I appreciate any clarity that you can provide.
>
> Aaron Spike
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/66c2a94a-e040-41ea-b9a2-27d42f88e7ff%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to