Updated a django patch to add origin information to query sets.
- Legacy-Id: 14792
This commit is contained in:
parent
49f00b76ea
commit
e0aed58cc1
|
@ -1,5 +1,5 @@
|
||||||
--- django/db/models/query.py 2017-04-07 15:10:29.426831000 -0700
|
--- /home/henrik/src/db/latest/env/lib/python2.7/site-packages/django/db/models/query.py 2018-03-13 07:07:54.156249000 -0700
|
||||||
+++ django/db/models/query.py 2017-04-12 08:23:20.061651277 -0700
|
+++ /home/henrik/src/db/trunk/env/lib/python2.7/site-packages/django/db/models/query.py 2018-03-14 09:06:43.378819023 -0700
|
||||||
@@ -5,6 +5,7 @@
|
@@ -5,6 +5,7 @@
|
||||||
import copy
|
import copy
|
||||||
import sys
|
import sys
|
||||||
|
@ -8,24 +8,8 @@
|
||||||
from collections import OrderedDict, deque
|
from collections import OrderedDict, deque
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@@ -34,7 +35,6 @@
|
@@ -171,6 +172,8 @@
|
||||||
# Pull into this namespace for backwards compatibility.
|
self._known_related_objects = {} # {rel_field: {pk: rel_obj}}
|
||||||
EmptyResultSet = sql.EmptyResultSet
|
|
||||||
|
|
||||||
-
|
|
||||||
class BaseIterable(object):
|
|
||||||
def __init__(self, queryset):
|
|
||||||
self.queryset = queryset
|
|
||||||
@@ -51,6 +51,7 @@
|
|
||||||
compiler = queryset.query.get_compiler(using=db)
|
|
||||||
# Execute the query. This will also fill compiler.select, klass_info,
|
|
||||||
# and annotations.
|
|
||||||
+
|
|
||||||
results = compiler.execute_sql()
|
|
||||||
select, klass_info, annotation_col_map = (compiler.select, compiler.klass_info,
|
|
||||||
compiler.annotation_col_map)
|
|
||||||
@@ -174,6 +175,8 @@
|
|
||||||
self._known_related_objects = {} # {rel_field, {pk: rel_obj}}
|
|
||||||
self._iterable_class = ModelIterable
|
self._iterable_class = ModelIterable
|
||||||
self._fields = None
|
self._fields = None
|
||||||
+ self._origin = []
|
+ self._origin = []
|
||||||
|
@ -33,7 +17,7 @@
|
||||||
|
|
||||||
def as_manager(cls):
|
def as_manager(cls):
|
||||||
# Address the circular dependency between `Queryset` and `Manager`.
|
# Address the circular dependency between `Queryset` and `Manager`.
|
||||||
@@ -316,6 +319,31 @@
|
@@ -310,6 +313,31 @@
|
||||||
combined.query.combine(other.query, sql.OR)
|
combined.query.combine(other.query, sql.OR)
|
||||||
return combined
|
return combined
|
||||||
|
|
||||||
|
@ -65,7 +49,7 @@
|
||||||
####################################
|
####################################
|
||||||
# METHODS THAT DO DATABASE QUERIES #
|
# METHODS THAT DO DATABASE QUERIES #
|
||||||
####################################
|
####################################
|
||||||
@@ -793,6 +821,7 @@
|
@@ -781,6 +809,7 @@
|
||||||
Returns a new QuerySet instance with the args ANDed to the existing
|
Returns a new QuerySet instance with the args ANDed to the existing
|
||||||
set.
|
set.
|
||||||
"""
|
"""
|
||||||
|
@ -73,7 +57,7 @@
|
||||||
return self._filter_or_exclude(False, *args, **kwargs)
|
return self._filter_or_exclude(False, *args, **kwargs)
|
||||||
|
|
||||||
def exclude(self, *args, **kwargs):
|
def exclude(self, *args, **kwargs):
|
||||||
@@ -800,6 +829,7 @@
|
@@ -788,6 +817,7 @@
|
||||||
Returns a new QuerySet instance with NOT (args) ANDed to the existing
|
Returns a new QuerySet instance with NOT (args) ANDed to the existing
|
||||||
set.
|
set.
|
||||||
"""
|
"""
|
||||||
|
@ -81,7 +65,7 @@
|
||||||
return self._filter_or_exclude(True, *args, **kwargs)
|
return self._filter_or_exclude(True, *args, **kwargs)
|
||||||
|
|
||||||
def _filter_or_exclude(self, negate, *args, **kwargs):
|
def _filter_or_exclude(self, negate, *args, **kwargs):
|
||||||
@@ -824,6 +854,7 @@
|
@@ -812,6 +842,7 @@
|
||||||
This exists to support framework features such as 'limit_choices_to',
|
This exists to support framework features such as 'limit_choices_to',
|
||||||
and usually it will be more natural to use other methods.
|
and usually it will be more natural to use other methods.
|
||||||
"""
|
"""
|
||||||
|
@ -89,15 +73,15 @@
|
||||||
if isinstance(filter_obj, Q) or hasattr(filter_obj, 'add_to_query'):
|
if isinstance(filter_obj, Q) or hasattr(filter_obj, 'add_to_query'):
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
clone.query.add_q(filter_obj)
|
clone.query.add_q(filter_obj)
|
||||||
@@ -836,6 +867,7 @@
|
@@ -866,6 +897,7 @@
|
||||||
Returns a new QuerySet instance that will select objects with a
|
|
||||||
FOR UPDATE lock.
|
|
||||||
"""
|
"""
|
||||||
|
if nowait and skip_locked:
|
||||||
|
raise ValueError('The nowait option cannot be used with skip_locked.')
|
||||||
+ self._add_origin()
|
+ self._add_origin()
|
||||||
obj = self._clone()
|
obj = self._clone()
|
||||||
obj._for_write = True
|
obj._for_write = True
|
||||||
obj.query.select_for_update = True
|
obj.query.select_for_update = True
|
||||||
@@ -855,6 +887,7 @@
|
@@ -886,6 +918,7 @@
|
||||||
if self._fields is not None:
|
if self._fields is not None:
|
||||||
raise TypeError("Cannot call select_related() after .values() or .values_list()")
|
raise TypeError("Cannot call select_related() after .values() or .values_list()")
|
||||||
|
|
||||||
|
@ -105,15 +89,15 @@
|
||||||
obj = self._clone()
|
obj = self._clone()
|
||||||
if fields == (None,):
|
if fields == (None,):
|
||||||
obj.query.select_related = False
|
obj.query.select_related = False
|
||||||
@@ -874,6 +907,7 @@
|
@@ -905,6 +938,7 @@
|
||||||
prefetch is appended to. If prefetch_related(None) is called, the list
|
prefetch is appended to. If prefetch_related(None) is called, the list
|
||||||
is cleared.
|
is cleared.
|
||||||
"""
|
"""
|
||||||
+ self._add_origin()
|
+ self._add_origin()
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
if lookups == (None,):
|
if lookups == (None,):
|
||||||
clone._prefetch_related_lookups = []
|
clone._prefetch_related_lookups = ()
|
||||||
@@ -886,6 +920,7 @@
|
@@ -917,6 +951,7 @@
|
||||||
Return a query set in which the returned objects have been annotated
|
Return a query set in which the returned objects have been annotated
|
||||||
with extra data or aggregations.
|
with extra data or aggregations.
|
||||||
"""
|
"""
|
||||||
|
@ -121,7 +105,7 @@
|
||||||
annotations = OrderedDict() # To preserve ordering of args
|
annotations = OrderedDict() # To preserve ordering of args
|
||||||
for arg in args:
|
for arg in args:
|
||||||
# The default_alias property may raise a TypeError, so we use
|
# The default_alias property may raise a TypeError, so we use
|
||||||
@@ -929,6 +964,7 @@
|
@@ -960,6 +995,7 @@
|
||||||
"""
|
"""
|
||||||
assert self.query.can_filter(), \
|
assert self.query.can_filter(), \
|
||||||
"Cannot reorder a query once a slice has been taken."
|
"Cannot reorder a query once a slice has been taken."
|
||||||
|
@ -129,7 +113,7 @@
|
||||||
obj = self._clone()
|
obj = self._clone()
|
||||||
obj.query.clear_ordering(force_empty=False)
|
obj.query.clear_ordering(force_empty=False)
|
||||||
obj.query.add_ordering(*field_names)
|
obj.query.add_ordering(*field_names)
|
||||||
@@ -940,6 +976,7 @@
|
@@ -971,6 +1007,7 @@
|
||||||
"""
|
"""
|
||||||
assert self.query.can_filter(), \
|
assert self.query.can_filter(), \
|
||||||
"Cannot create distinct fields once a slice has been taken."
|
"Cannot create distinct fields once a slice has been taken."
|
||||||
|
@ -137,7 +121,7 @@
|
||||||
obj = self._clone()
|
obj = self._clone()
|
||||||
obj.query.add_distinct_fields(*field_names)
|
obj.query.add_distinct_fields(*field_names)
|
||||||
return obj
|
return obj
|
||||||
@@ -951,6 +988,7 @@
|
@@ -982,6 +1019,7 @@
|
||||||
"""
|
"""
|
||||||
assert self.query.can_filter(), \
|
assert self.query.can_filter(), \
|
||||||
"Cannot change a query once a slice has been taken"
|
"Cannot change a query once a slice has been taken"
|
||||||
|
@ -145,7 +129,7 @@
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
clone.query.add_extra(select, select_params, where, params, tables, order_by)
|
clone.query.add_extra(select, select_params, where, params, tables, order_by)
|
||||||
return clone
|
return clone
|
||||||
@@ -959,6 +997,7 @@
|
@@ -990,6 +1028,7 @@
|
||||||
"""
|
"""
|
||||||
Reverses the ordering of the QuerySet.
|
Reverses the ordering of the QuerySet.
|
||||||
"""
|
"""
|
||||||
|
@ -153,7 +137,7 @@
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
clone.query.standard_ordering = not clone.query.standard_ordering
|
clone.query.standard_ordering = not clone.query.standard_ordering
|
||||||
return clone
|
return clone
|
||||||
@@ -973,6 +1012,7 @@
|
@@ -1004,6 +1043,7 @@
|
||||||
"""
|
"""
|
||||||
if self._fields is not None:
|
if self._fields is not None:
|
||||||
raise TypeError("Cannot call defer() after .values() or .values_list()")
|
raise TypeError("Cannot call defer() after .values() or .values_list()")
|
||||||
|
@ -161,7 +145,7 @@
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
if fields == (None,):
|
if fields == (None,):
|
||||||
clone.query.clear_deferred_loading()
|
clone.query.clear_deferred_loading()
|
||||||
@@ -992,6 +1032,7 @@
|
@@ -1023,6 +1063,7 @@
|
||||||
# Can only pass None to defer(), not only(), as the rest option.
|
# Can only pass None to defer(), not only(), as the rest option.
|
||||||
# That won't stop people trying to do this, so let's be explicit.
|
# That won't stop people trying to do this, so let's be explicit.
|
||||||
raise TypeError("Cannot pass None as an argument to only().")
|
raise TypeError("Cannot pass None as an argument to only().")
|
||||||
|
@ -169,7 +153,7 @@
|
||||||
clone = self._clone()
|
clone = self._clone()
|
||||||
clone.query.add_immediate_loading(fields)
|
clone.query.add_immediate_loading(fields)
|
||||||
return clone
|
return clone
|
||||||
@@ -1078,6 +1119,7 @@
|
@@ -1109,6 +1150,7 @@
|
||||||
clone._known_related_objects = self._known_related_objects
|
clone._known_related_objects = self._known_related_objects
|
||||||
clone._iterable_class = self._iterable_class
|
clone._iterable_class = self._iterable_class
|
||||||
clone._fields = self._fields
|
clone._fields = self._fields
|
||||||
|
@ -177,10 +161,10 @@
|
||||||
|
|
||||||
clone.__dict__.update(kwargs)
|
clone.__dict__.update(kwargs)
|
||||||
return clone
|
return clone
|
||||||
@@ -1085,6 +1127,8 @@
|
@@ -1116,6 +1158,8 @@
|
||||||
def _fetch_all(self):
|
def _fetch_all(self):
|
||||||
if self._result_cache is None:
|
if self._result_cache is None:
|
||||||
self._result_cache = list(self.iterator())
|
self._result_cache = list(self._iterable_class(self))
|
||||||
+ if settings.DEBUG:
|
+ if settings.DEBUG:
|
||||||
+ connections[self.db].queries_log[-1]['origin'] = self._origin
|
+ connections[self.db].queries_log[-1]['origin'] = self._origin
|
||||||
if self._prefetch_related_lookups and not self._prefetch_done:
|
if self._prefetch_related_lookups and not self._prefetch_done:
|
||||||
|
|
Loading…
Reference in a new issue