Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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

…nks to John Debs.
  • Loading branch information...
commit 2c47db8fcc284a92d2c9769ba503603fbea92660 1 parent 3cc7d48
@bconstantin authored
View
33 CHANGES.html
@@ -225,6 +225,17 @@
</div>
<div class="section" id="changelog">
<h1>Changelog</h1>
+<div class="section" id="v1-0-release-candidate-1">
+<h2>2011-01-24 V1.0 Release Candidate 1</h2>
+<div class="section" id="bugfixes">
+<h3>Bugfixes</h3>
+<ul class="simple">
+<li>Fixed GitHub issue 15 (query result incomplete with inheritance).
+Thanks to John Debs for reporting and the test case.</li>
+</ul>
+</div>
+</div>
+<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 @@
</li>
</ul>
</div>
-<div class="section" id="bugfixes">
+<div class="section" id="id1">
<h3>Bugfixes</h3>
<ul class="simple">
<li>Custom fields could cause problems when used as the primary key.
@@ -349,7 +360,7 @@
</li>
</ul>
</div>
-<div class="section" id="id1">
+<div class="section" id="id2">
<h3>Bugfixes</h3>
<ul class="simple">
<li>Removed requirement for primary key to be an IntegerField.
@@ -387,7 +398,7 @@
</div>
</div>
<hr class="docutils" />
-<div class="section" id="id2">
+<div class="section" id="id3">
<h2>2010-2-22</h2>
<p>IMPORTANT: API Changed (import path changed), and Installation Note</p>
<p>The django_polymorphic source code has been restructured
@@ -411,11 +422,11 @@
<ul class="simple">
<li>minor API addition: 'from polymorphic import VERSION, get_version'</li>
</ul>
-<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>
-<div class="section" id="id4">
+<div class="section" id="id5">
<h3>Bugfixes</h3>
<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 @@
</div>
</div>
<hr class="docutils" />
-<div class="section" id="id5">
+<div class="section" id="id6">
<h2>2010-2-4</h2>
<div class="section" id="new-features-and-documentation">
<h3>New features (and documentation)</h3>
@@ -442,7 +453,7 @@
<p>More about these additions in the docs:
<a class="reference external" href="http://bserve.webhop.org/wiki/django_polymorphic/doc">http://bserve.webhop.org/wiki/django_polymorphic/doc</a></p>
</div>
-<div class="section" id="id6">
+<div class="section" id="id7">
<h3>Bugfixes</h3>
<ul class="simple">
<li>fix remaining potential accessor name clashes (but this only works
@@ -467,7 +478,7 @@
</div>
</div>
<hr class="docutils" />
-<div class="section" id="id7">
+<div class="section" id="id8">
<h2>2010-1-30</h2>
<p>Fixed ContentType related field accessor clash (an error emitted
by model validation) by adding related_name to the ContentType
@@ -475,7 +486,7 @@
ForeignKey. Thanks to Andrew Ingram.</p>
</div>
<hr class="docutils" />
-<div class="section" id="id8">
+<div class="section" id="id9">
<h2>2010-1-29</h2>
<p>Restructured django_polymorphic into a regular Django add-on
application. This is needed for the management commands, and
@@ -486,7 +497,7 @@
(&quot;installation/testing&quot;) for more info.</p>
</div>
<hr class="docutils" />
-<div class="section" id="id9">
+<div class="section" id="id10">
<h2>2010-1-28</h2>
<p>Added the polymorphic_dumpdata management command (github issue 4),
for creating fixtures, this should be used instead of
@@ -497,7 +508,7 @@
ContentType).</p>
</div>
<hr class="docutils" />
-<div class="section" id="id10">
+<div class="section" id="id11">
<h2>2010-1-26</h2>
<p>IMPORTANT - database schema change (more info in change log).
I hope I got this change in early enough before anyone started
View
12 CHANGES.rst
@@ -3,6 +3,18 @@
Changelog
++++++++++
+2011-01-24 V1.0 Release Candidate 1
+===================================
+
+Bugfixes
+------------------------
+
+* 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
======================
View
7 polymorphic/base.py
@@ -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 query.py)
+ for f in new_class._meta.fields:
+ if f.primary_key and type(f)!=models.OneToOneField:
+ new_class.polymorphic_primary_key_name=f.name
+ break
+
return new_class
def get_inherited_managers(self, attrs):
View
6 polymorphic/query.py
@@ -161,7 +161,9 @@ class self.model, but as a class derived from self.model. We want to re-fetch
# We get different type(o.pk) 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 = self.model._meta.pk.name
+ # We might assume that self.model._meta.pk.name 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 base.py.
+ 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
View
22 polymorphic/tests.py
@@ -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()
+>>> t.save()
+>>> m = Middle()
+>>> m.save()
+>>> b = Bottom()
+>>> b.save()
+>>> 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
Please sign in to comment.
Something went wrong with that request. Please try again.