added "queryset.get_real_instances()" usage, added testcase
This commit is contained in:
+18
-3
@@ -91,13 +91,14 @@ class PolymorphicQuerySet(QuerySet):
|
||||
self.polymorphic_disabled = True
|
||||
return super(PolymorphicQuerySet, self).aggregate(*args, **kwargs)
|
||||
|
||||
# Since django_polymorphic 'V1.0 beta2', extra() always returns polymorphic results.
|
||||
# Since django_polymorphic 'V1.0 beta2', extra() always returns polymorphic results.^
|
||||
# The resulting objects are required to have a unique primary key within the result set
|
||||
# (otherwise an error is thrown).
|
||||
# The "polymorphic" keyword argument is not supported anymore.
|
||||
#def extra(self, *args, **kwargs):
|
||||
|
||||
def get_real_instances(self, base_result_objects):
|
||||
|
||||
def _get_real_instances(self, base_result_objects):
|
||||
"""
|
||||
Polymorphic object loader
|
||||
|
||||
@@ -229,7 +230,7 @@ class PolymorphicQuerySet(QuerySet):
|
||||
reached_end = True
|
||||
break
|
||||
|
||||
real_results = self.get_real_instances(base_result_objects)
|
||||
real_results = self._get_real_instances(base_result_objects)
|
||||
|
||||
for o in real_results:
|
||||
yield o
|
||||
@@ -243,3 +244,17 @@ class PolymorphicQuerySet(QuerySet):
|
||||
else:
|
||||
return super(PolymorphicQuerySet,self).__repr__(*args, **kwargs)
|
||||
|
||||
class _p_list_class(list):
|
||||
def __repr__(self, *args, **kwargs):
|
||||
result = [ repr(o) for o in self ]
|
||||
return '[ ' + ',\n '.join(result) + ' ]'
|
||||
|
||||
def get_real_instances(self, base_result_objects=None):
|
||||
"same as _get_real_instances, but make sure that __repr__ for ShowField... creates correct output"
|
||||
if not base_result_objects: base_result_objects=self
|
||||
olist = self._get_real_instances(base_result_objects)
|
||||
if not self.model.polymorphic_query_multiline_output:
|
||||
return olist
|
||||
clist=PolymorphicQuerySet._p_list_class(olist)
|
||||
return clist
|
||||
|
||||
|
||||
+15
-1
@@ -285,7 +285,7 @@ __test__ = {"doctest": """
|
||||
<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)> ]
|
||||
|
||||
# manual get_real_instance()
|
||||
>>> o=Model2A.base_objects.get(field1='C1')
|
||||
>>> o=Model2A.objects.non_polymorphic().get(field1='C1')
|
||||
>>> o.get_real_instance()
|
||||
<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>
|
||||
|
||||
@@ -296,6 +296,20 @@ __test__ = {"doctest": """
|
||||
<Model2A: id 3, field1 (CharField)>,
|
||||
<Model2A: id 4, field1 (CharField)> ]
|
||||
|
||||
# get_real_instances()
|
||||
>>> qs.get_real_instances()
|
||||
[ <Model2A: id 1, field1 (CharField)>,
|
||||
<Model2B: id 2, field1 (CharField), field2 (CharField)>,
|
||||
<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>,
|
||||
<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)> ]
|
||||
|
||||
>>> l=list(qs)
|
||||
>>> Model2A.objects.get_real_instances(l)
|
||||
[ <Model2A: id 1, field1 (CharField)>,
|
||||
<Model2B: id 2, field1 (CharField), field2 (CharField)>,
|
||||
<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>,
|
||||
<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)> ]
|
||||
|
||||
|
||||
### test inheritance pointers & _base_managers
|
||||
|
||||
|
||||
Reference in New Issue
Block a user