Commit d068ad0c authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Using querysets as an rvalue in filter() calls was causing an unnecessary

database query, due to a bool() call. This change stops that behaviour.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9715 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent d00c013c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -651,6 +651,10 @@ class QuerySet(object):
        obj = self.values("pk")
        return obj.query.as_nested_sql()

    # When used as part of a nested query, a queryset will never be an "always
    # empty" result.
    value_annotation = True

class ValuesQuerySet(QuerySet):
    def __init__(self, *args, **kwargs):
        super(ValuesQuerySet, self).__init__(*args, **kwargs)
@@ -795,6 +799,10 @@ class EmptyQuerySet(QuerySet):
        # (it raises StopIteration immediately).
        yield iter([]).next()

    # EmptyQuerySet is always an empty result in where-clauses (and similar
    # situations).
    value_annotation = False


def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
                   requested=None):
+2 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ class WhereNode(tree.Node):
        # here in the future (using Python types is suggested for consistency).
        if isinstance(value, datetime.datetime):
            annotation = datetime.datetime
        elif hasattr(value, 'value_annotation'):
            annotation = value.value_annotation
        else:
            annotation = bool(value)

+7 −0
Original line number Diff line number Diff line
@@ -1015,6 +1015,13 @@ performance problems on backends like MySQL.
>>> Annotation.objects.filter(notes__in=Note.objects.filter(note="n1"))
[<Annotation: a1>]

Nested queries should not evaluate the inner query as part of constructing the
SQL. This test verifies this: if the inner query is evaluated, the outer "in"
lookup will raise an EmptyResultSet exception (as the inner query returns
nothing).
>>> print Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query
SELECT ...

"""}

# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__