diff options
| author | Hasan Ramezani <hasan.r67@gmail.com> | 2019-10-10 21:13:21 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-10-11 09:18:23 +0200 |
| commit | c1cfec6b500c16200a4c2ef5676439c3cc987bc2 (patch) | |
| tree | 2a523b021b2c6a8c03c63cddffe318abe95f4083 /django | |
| parent | 0dede9e9814282d6813270cd4cdd65166d119522 (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.py | 10 |
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) |
