EmptyQuerySet isinstance check broken with not QuerySet datatypes
isinstance check on any instance, that is not QuerySet (actually anything without .query attribute) and django.db.models.query.EmptyQuerySet throws AttributeError.
Code to reproduce.
In [9]: from django.db.models.query import EmptyQuerySet
In [10]: isinstance(1, EmptyQuerySet)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-10-79a6a197988a> in <module>()
----> 1 isinstance(1, EmptyQuerySet)
/home/vprokhoda/Envs/ADMIN2/local/lib/python2.7/site-packages/django/db/models/query.pyc in __instancecheck__(self, instance)
1171 class InstanceCheckMeta(type):
1172 def __instancecheck__(self, instance):
-> 1173 return instance.query.is_empty()
1174
1175
AttributeError: 'int' object has no attribute 'query'
In [11]:
In [11]: import django
In [12]: django.__version__
Out[12]: '1.9'
Quick and dirty fix is
(django)vprokhoda@tests$ git diff
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 45c0320..0cc5f94 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1171,7 +1171,7 @@ class QuerySet(object):
class InstanceCheckMeta(type):
def __instancecheck__(self, instance):
- return instance.query.is_empty()
+ return hasattr(instance, 'query') and instance.query.is_empty()
Change History
(9)
Type: |
Uncategorized → Bug
|
Component: |
Uncategorized → Database layer (models, ORM)
|
Easy pickings: |
set
|
Triage Stage: |
Unreviewed → Accepted
|
Owner: |
changed from nobody to Anderson Resende
|
Status: |
new → assigned
|
Patch needs improvement: |
set
|
Patch needs improvement: |
unset
|
Resolution: |
→ fixed
|
Status: |
assigned → closed
|
I think the appropriate fix should involve making sure
isinstance(instance, QuerySet)
instead of checking forquery
attribute existence which fails ifnot hasattr(instance.query, 'is_empty') or not callable(instance.query.is_empty)
.