#11079 closed Bug (fixed)
Multi-table inheritance subclasses cannot be proxied
| Reported by: | George Song | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.0 |
| Severity: | Normal | Keywords: | model proxy multi-table inheritance |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Creating a proxy model for a multi-table inherited subclass fails.
class Place(models.Model): name = models.CharField(max_length=50) class Restaurant(Place): genre = models.CharField(max_length=50) class PizzaJoint(Restaurant): class Meta: proxy = True >>> from proxy.models import Restaurant, PizzaJoint >>> Restaurant.objects.create(name='Greasy Pizza', genre='pizza') <Restaurant: Restaurant object> >>> Restaurant.objects.all() [<Restaurant: Restaurant object>] >>> PizzaJoint.objects.all() []
Also when accessing admin/proxy/pizzajoint/, you get the following stack trace:
Template error:
In template e:\lehrhaus\django\django\contrib\admin\templates\admin\change_list.html, error at line 78
Caught an exception while rendering: 'NoneType' object has no attribute 'column'
68 : {% endif %}
69 : {% endblock %}
70 :
71 : <form action="" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %}>
72 : {% if cl.formset %}
73 : {{ cl.formset.management_form }}
74 : {% endif %}
75 :
76 : {% block result_list %}
77 : {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
78 : {% result_list cl %}
79 : {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
80 : {% endblock %}
81 : {% block pagination %}{% pagination cl %}{% endblock %}
82 : </form>
83 : </div>
84 : </div>
85 : {% endblock %}
86 :
Traceback:
File "E:\lehrhaus\django\django\core\handlers\base.py" in get_response
92. response = callback(request, *callback_args, **callback_kwargs)
File "E:\lehrhaus\django\django\contrib\admin\options.py" in wrapper
226. return self.admin_site.admin_view(view)(*args, **kwargs)
File "E:\lehrhaus\django\django\contrib\admin\sites.py" in inner
184. return view(request, *args, **kwargs)
File "E:\lehrhaus\django\django\contrib\admin\options.py" in changelist_view
984. ], context, context_instance=template.RequestContext(request))
File "E:\lehrhaus\django\django\shortcuts\__init__.py" in render_to_response
20. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "E:\lehrhaus\django\django\template\loader.py" in render_to_string
108. return t.render(context_instance)
File "E:\lehrhaus\django\django\template\__init__.py" in render
178. return self.nodelist.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
779. bits.append(self.render_node(node, context))
File "E:\lehrhaus\django\django\template\debug.py" in render_node
71. result = node.render(context)
File "E:\lehrhaus\django\django\template\loader_tags.py" in render
97. return compiled_parent.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
178. return self.nodelist.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
779. bits.append(self.render_node(node, context))
File "E:\lehrhaus\django\django\template\debug.py" in render_node
71. result = node.render(context)
File "E:\lehrhaus\django\django\template\loader_tags.py" in render
97. return compiled_parent.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
178. return self.nodelist.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
779. bits.append(self.render_node(node, context))
File "E:\lehrhaus\django\django\template\debug.py" in render_node
71. result = node.render(context)
File "E:\lehrhaus\django\django\template\loader_tags.py" in render
24. result = self.nodelist.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
779. bits.append(self.render_node(node, context))
File "E:\lehrhaus\django\django\template\debug.py" in render_node
71. result = node.render(context)
File "E:\lehrhaus\django\django\template\loader_tags.py" in render
24. result = self.nodelist.render(context)
File "E:\lehrhaus\django\django\template\__init__.py" in render
779. bits.append(self.render_node(node, context))
File "E:\lehrhaus\django\django\template\debug.py" in render_node
81. raise wrapped
Exception Type: TemplateSyntaxError at /admin/proxy/pizzajoint/
Exception Value: Caught an exception while rendering: 'NoneType' object has no attribute 'column'
Original Traceback (most recent call last):
File "E:\lehrhaus\django\django\template\debug.py", line 71, in render_node
result = node.render(context)
File "E:\lehrhaus\django\django\template\__init__.py", line 936, in render
dict = func(*args)
File "E:\lehrhaus\django\django\contrib\admin\templatetags\admin_list.py", line 251, in result_list
return {'cl': cl,
File "E:\lehrhaus\django\django\contrib\admin\templatetags\admin_list.py", line 247, in results
for res in cl.result_list:
File "E:\lehrhaus\django\django\db\models\query.py", line 93, in _result_iter
self._fill_cache()
File "E:\lehrhaus\django\django\db\models\query.py", line 660, in _fill_cache
self._result_cache.append(self._iter.next())
File "E:\lehrhaus\django\django\db\models\query.py", line 207, in iterator
for row in self.query.results_iter():
File "E:\lehrhaus\django\django\db\models\sql\query.py", line 287, in results_iter
for rows in self.execute_sql(MULTI):
File "E:\lehrhaus\django\django\db\models\sql\query.py", line 2336, in execute_sql
sql, params = self.as_sql()
File "E:\lehrhaus\django\django\db\models\sql\query.py", line 395, in as_sql
self.pre_sql_setup()
File "E:\lehrhaus\django\django\db\models\sql\query.py", line 587, in pre_sql_setup
self.setup_inherited_models()
File "E:\lehrhaus\django\django\db\models\sql\query.py", line 1311, in setup_inherited_models
seen[model] = self.join((root_alias, model._meta.db_table,
AttributeError: 'NoneType' object has no attribute 'column'
Change History (7)
comment:1 by , 16 years ago
| Summary: | Multi-table inheritance subclassed cannot be proxied → Multi-table inheritance subclasses cannot be proxied |
|---|
comment:2 by , 16 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:3 by , 14 years ago
| Severity: | → Normal |
|---|---|
| Type: | → Bug |
comment:4 by , 14 years ago
| UI/UX: | unset |
|---|
comment:6 by , 14 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
| Version: | SVN → 1.3 |
Cannot reproduce on django 1.4
>>> import django >>> django.VERSION (1, 4, 0, 'final', 0) >>> from ticket_11079.models import Restaurant, PizzaJoint >>> Restaurant.objects.create(name='Greasy Pizza', genre='pizza') <Restaurant: Restaurant object> >>> Restaurant.objects.all() [<Restaurant: Restaurant object>] >>> PizzaJoint.objects.all() [<PizzaJoint: PizzaJoint object>]
django 1.3.1
>>> import django >>> django.VERSION (1, 3, 1, 'final', 0) >>> from ticket_11079.models import Restaurant, PizzaJoint >>> Restaurant.objects.create(name='Greasy Pizza', genre='pizza') <Restaurant: Restaurant object> >>> Restaurant.objects.all() [<Restaurant: Restaurant object>] >>> PizzaJoint.objects.all() [<PizzaJoint: PizzaJoint object>]
And django 1.2.7
>>> import django >>> django.VERSION (1, 2, 7, 'final', 0) >>> from ticket_11079.models import Restaurant, PizzaJoint >>> Restaurant.objects.create(name='Greasy Pizza', genre='pizza') <Restaurant: Restaurant object> >>> Restaurant.objects.all() [<Restaurant: Restaurant object>] >>> PizzaJoint.objects.all() [<PizzaJoint: PizzaJoint object>]
At the time this ticket was created (05/12/09) django 1.1 was about not event released. I cannot find which commit fixed this issue but since it has been fixed in trunk for about 3 years I'm marking this ticket as fixed.
Version 0, edited 14 years ago by (next)
comment:7 by , 14 years ago
| Version: | 1.3 → 1.0 |
|---|
Note:
See TracTickets
for help on using tickets.
Change UI/UX from NULL to False.