diff options
| author | Ran Benita <ran234@gmail.com> | 2017-10-17 11:28:00 +0800 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-10-28 20:33:42 -0400 |
| commit | 03049fb8d96ccd1f1ed0285486103542de42faba (patch) | |
| tree | 243c0b4cc9b622a47ce7a665d36d8b4ab4973a0d /django/db/models/sql | |
| parent | 56b364bacca0d6a6cd8fbcd93aeb49f3ad46e58c (diff) | |
Refs #28010 -- Allowed reverse related fields in SELECT FOR UPDATE .. OF.
Thanks Adam Chidlow for polishing the patch.
Diffstat (limited to 'django/db/models/sql')
| -rw-r--r-- | django/db/models/sql/compiler.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 93ba60638a..a3a37b52be 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -783,6 +783,7 @@ class SQLCompiler: klass_info = { 'model': f.remote_field.model, 'field': f, + 'reverse': False, 'local_setter': f.set_cached_value, 'remote_setter': f.remote_field.set_cached_value if f.unique else lambda x, y: None, 'from_parent': False, @@ -821,6 +822,7 @@ class SQLCompiler: klass_info = { 'model': model, 'field': f, + 'reverse': True, 'local_setter': f.remote_field.set_cached_value, 'remote_setter': f.set_cached_value, 'from_parent': from_parent, @@ -858,6 +860,7 @@ class SQLCompiler: klass_info = { 'model': model, 'field': f, + 'reverse': True, 'local_setter': local_setter, 'remote_setter': remote_setter, 'from_parent': from_parent, @@ -905,7 +908,10 @@ class SQLCompiler: path = [] yield 'self' else: - path = parent_path + [klass_info['field'].name] + field = klass_info['field'] + if klass_info['reverse']: + field = field.remote_field + path = parent_path + [field.name] yield LOOKUP_SEP.join(path) queue.extend( (path, klass_info) @@ -918,7 +924,10 @@ class SQLCompiler: klass_info = self.klass_info for part in parts: for related_klass_info in klass_info.get('related_klass_infos', []): - if related_klass_info['field'].name == part: + field = related_klass_info['field'] + if related_klass_info['reverse']: + field = field.remote_field + if field.name == part: klass_info = related_klass_info break else: |
