summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2019-10-10 21:13:21 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-10-11 09:18:23 +0200
commitc1cfec6b500c16200a4c2ef5676439c3cc987bc2 (patch)
tree2a523b021b2c6a8c03c63cddffe318abe95f4083 /django
parent0dede9e9814282d6813270cd4cdd65166d119522 (diff)
[3.0.x] Fixed #30854 -- Fixed QuerySet.select_related() with multiple FilteredRelations.
Backport of 6a75cea76a98c08bf2e20d787be9b14c2cd94860 from master.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/sql/compiler.py10
1 files changed, 6 insertions, 4 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 5da862f716..e85e73de50 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -1,6 +1,7 @@
import collections
import re
import warnings
+from functools import partial
from itertools import chain
from django.core.exceptions import EmptyResultSet, FieldError
@@ -902,6 +903,10 @@ class SQLCompiler:
select, model._meta, alias, cur_depth + 1,
next, restricted)
get_related_klass_infos(klass_info, next_klass_infos)
+
+ def remote_setter(name, obj, from_obj):
+ setattr(from_obj, name, obj)
+
for name in list(requested):
# Filtered relations work only on the topmost level.
if cur_depth > 1:
@@ -917,15 +922,12 @@ class SQLCompiler:
# Set a reverse fk object when relation is non-empty.
if from_obj:
f.remote_field.set_cached_value(from_obj, obj)
-
- def remote_setter(obj, from_obj):
- setattr(from_obj, name, obj)
klass_info = {
'model': model,
'field': f,
'reverse': True,
'local_setter': local_setter,
- 'remote_setter': remote_setter,
+ 'remote_setter': partial(remote_setter, name),
'from_parent': from_parent,
}
related_klass_infos.append(klass_info)