Factored out a semi-complex if-test that was used in two places.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7782 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-06-29 09:40:17 +00:00
parent a8fa3fd81f
commit 5326cd293e
3 changed files with 22 additions and 6 deletions

View File

@ -3,7 +3,7 @@ import warnings
from django.conf import settings from django.conf import settings
from django.db import connection, transaction, IntegrityError from django.db import connection, transaction, IntegrityError
from django.db.models.fields import DateField, FieldDoesNotExist from django.db.models.fields import DateField, FieldDoesNotExist
from django.db.models.query_utils import Q from django.db.models.query_utils import Q, select_related_descend
from django.db.models import signals, sql from django.db.models import signals, sql
from django.dispatch import dispatcher from django.dispatch import dispatcher
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
@ -761,8 +761,7 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
index_end = index_start + len(klass._meta.fields) index_end = index_start + len(klass._meta.fields)
obj = klass(*row[index_start:index_end]) obj = klass(*row[index_start:index_end])
for f in klass._meta.fields: for f in klass._meta.fields:
if (not f.rel or (not restricted and f.null) or if not select_related_descend(f, restricted, requested):
(restricted and f.name not in requested) or f.rel.parent_link):
continue continue
if restricted: if restricted:
next = requested[f.name] next = requested[f.name]

View File

@ -48,3 +48,20 @@ class Q(tree.Node):
obj.negate() obj.negate()
return obj return obj
def select_related_descend(field, restricted, requested):
"""
Returns True if this field should be used to descend deeper for
select_related() purposes. Used by both the query construction code
(sql.query.fill_related_selections()) and the model instance creation code
(query.get_cached_row()).
"""
if not field.rel:
return False
if field.rel.parent_link:
return False
if restricted and field.name not in requested:
return False
if not restricted and field.null:
return False
return True

View File

@ -15,9 +15,10 @@ from django.utils.datastructures import SortedDict
from django.dispatch import dispatcher from django.dispatch import dispatcher
from django.db import connection from django.db import connection
from django.db.models import signals from django.db.models import signals
from django.db.models.fields import FieldDoesNotExist
from django.db.models.query_utils import select_related_descend
from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR
from django.db.models.sql.datastructures import Count from django.db.models.sql.datastructures import Count
from django.db.models.fields import FieldDoesNotExist
from django.core.exceptions import FieldError from django.core.exceptions import FieldError
from datastructures import EmptyResultSet, Empty, MultiJoin from datastructures import EmptyResultSet, Empty, MultiJoin
from constants import * from constants import *
@ -915,8 +916,7 @@ class Query(object):
restricted = False restricted = False
for f, model in opts.get_fields_with_model(): for f, model in opts.get_fields_with_model():
if (not f.rel or (restricted and f.name not in requested) or if not select_related_descend(f, restricted, requested):
(not restricted and f.null) or f.rel.parent_link):
continue continue
dupe_set = orig_dupe_set.copy() dupe_set = orig_dupe_set.copy()
used = orig_used.copy() used = orig_used.copy()