Browse files

Fixed github issue 15 (query result incomplete with inheritance). Tha…

…nks to John Debs.
  • Loading branch information...
bconstantin committed Jan 24, 2011
1 parent 3cc7d48 commit 2c47db8fcc284a92d2c9769ba503603fbea92660
Showing with 67 additions and 13 deletions.
  1. +22 −11 CHANGES.html
  2. +12 −0 CHANGES.rst
  3. +7 −0 polymorphic/
  4. +4 −2 polymorphic/
  5. +22 −0 polymorphic/
@@ -225,6 +225,17 @@ <h1><em>django_polymorphic</em></h1>
<div class="section" id="changelog">
+<div class="section" id="v1-0-release-candidate-1">
+<h2>2011-01-24 V1.0 Release Candidate 1</h2>
+<div class="section" id="bugfixes">
+<ul class="simple">
+<li>Fixed GitHub issue 15 (query result incomplete with inheritance).
+Thanks to John Debs for reporting and the test case.</li>
+<hr class="docutils" />
<div class="section" id="v1-0-beta-2">
<h2>2010-11-11 V1.0 Beta 2</h2>
<div class="section" id="this-is-a-v1-0-testing-release">
@@ -283,7 +294,7 @@ <h3>New Features and API changes in Beta 2 since Beta 1</h3>
-<div class="section" id="bugfixes">
+<div class="section" id="id1">
<ul class="simple">
<li>Custom fields could cause problems when used as the primary key.
@@ -349,7 +360,7 @@ <h3>New Features</h3>
-<div class="section" id="id1">
+<div class="section" id="id2">
<ul class="simple">
<li>Removed requirement for primary key to be an IntegerField.
@@ -387,7 +398,7 @@ <h3>API Changes</h3>
<hr class="docutils" />
-<div class="section" id="id2">
+<div class="section" id="id3">
<p>IMPORTANT: API Changed (import path changed), and Installation Note</p>
<p>The django_polymorphic source code has been restructured
@@ -411,11 +422,11 @@ <h2>2010-2-22</h2>
<ul class="simple">
<li>minor API addition: 'from polymorphic import VERSION, get_version'</li>
-<div class="section" id="id3">
+<div class="section" id="id4">
<h3>New Features</h3>
<p>Python 2.4 compatibility, contributed by Charles Leifer. Thanks!</p>
-<div class="section" id="id4">
+<div class="section" id="id5">
<p>Fix: The exception &quot;...has no attribute 'sub_and_superclass_dict'&quot;
could be raised. (This occurred if a subclass defined __init__
@@ -429,7 +440,7 @@ <h3>Bugfixes</h3>
<hr class="docutils" />
-<div class="section" id="id5">
+<div class="section" id="id6">
<div class="section" id="new-features-and-documentation">
<h3>New features (and documentation)</h3>
@@ -442,7 +453,7 @@ <h3>New features (and documentation)</h3>
<p>More about these additions in the docs:
<a class="reference external" href=""></a></p>
-<div class="section" id="id6">
+<div class="section" id="id7">
<ul class="simple">
<li>fix remaining potential accessor name clashes (but this only works
@@ -467,15 +478,15 @@ <h3>&quot;Restrictions &amp; Caveats&quot; updated</h3>
<hr class="docutils" />
-<div class="section" id="id7">
+<div class="section" id="id8">
<p>Fixed ContentType related field accessor clash (an error emitted
by model validation) by adding related_name to the ContentType
ForeignKey. This happened if your polymorphc model used a ContentType
ForeignKey. Thanks to Andrew Ingram.</p>
<hr class="docutils" />
-<div class="section" id="id8">
+<div class="section" id="id9">
<p>Restructured django_polymorphic into a regular Django add-on
application. This is needed for the management commands, and
@@ -486,7 +497,7 @@ <h2>2010-1-29</h2>
(&quot;installation/testing&quot;) for more info.</p>
<hr class="docutils" />
-<div class="section" id="id9">
+<div class="section" id="id10">
<p>Added the polymorphic_dumpdata management command (github issue 4),
for creating fixtures, this should be used instead of
@@ -497,7 +508,7 @@ <h2>2010-1-28</h2>
<hr class="docutils" />
-<div class="section" id="id10">
+<div class="section" id="id11">
<p>IMPORTANT - database schema change (more info in change log).
I hope I got this change in early enough before anyone started
@@ -3,6 +3,18 @@
+2011-01-24 V1.0 Release Candidate 1
+* Fixed GitHub issue 15 (query result incomplete with inheritance).
+ Thanks to John Debs for reporting and the test case.
2010-11-11 V1.0 Beta 2
@@ -76,6 +76,13 @@ def __new__(self, model_name, bases, attrs):
# for __init__ function of this class (monkeypatching inheritance accessors)
new_class.polymorphic_super_sub_accessors_replaced = False
+ # determine the name of the primary key field and store it into the class variable
+ # polymorphic_primary_key_name (it is needed by
+ for f in new_class._meta.fields:
+ if f.primary_key and type(f)!=models.OneToOneField:
+ break
return new_class
def get_inherited_managers(self, attrs):
@@ -161,7 +161,9 @@ class self.model, but as a class derived from self.model. We want to re-fetch
# We get different type( in this case.
# We work around this by using the real name of the field directly
# for accessing the primary key of the the derived objects.
- pk_name =
+ # We might assume that gives us the name of the primary key field,
+ # but it doesn't. Therefore we use polymorphic_primary_key_name, which we set up in
+ pk_name = self.model.polymorphic_primary_key_name
# For each model in "idlist_per_model" request its objects (the real model)
# from the db and store them in results[].
@@ -184,7 +186,7 @@ class self.model, but as a class derived from self.model. We want to re-fetch
for select_field_name in self.query.extra_select.keys():
attr = getattr(base_result_objects_by_id[o_pk], select_field_name)
setattr(o, select_field_name, attr)
results[o_pk] = o
# re-create correct order and return result list
@@ -156,6 +156,14 @@ class InitTestModelSubclass(InitTestModel):
def x(self):
return 'XYZ'
+# models from github issue
+class Top(PolymorphicModel):
+ name = models.CharField(max_length=50)
+class Middle(Top):
+ description = models.TextField()
+class Bottom(Middle):
+ author = models.CharField(max_length=50)
# UUID tests won't work with Django 1.1
if not (django_VERSION[0] <= 1 and django_VERSION[1] <= 1):
@@ -610,6 +618,20 @@ def show_base_manager(model):
#>>> print 'DiamondXY fields 1: field_b "%s", field_x "%s", field_y "%s"' % (o.field_b, o.field_x, o.field_y)
#DiamondXY fields 1: field_b "a", field_x "x", field_y "y"
+# test for github issue
+>>> t = Top()
+>>> m = Middle()
+>>> b = Bottom()
+>>> Top.objects.all()
+[<Top: Top object>, <Middle: Middle object>, <Bottom: Bottom object>]
+>>> Middle.objects.all()
+[<Middle: Middle object>, <Bottom: Bottom object>]
+>>> Bottom.objects.all()
+[<Bottom: Bottom object>]
>>> settings.DEBUG=False

0 comments on commit 2c47db8

Please sign in to comment.