summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
authorRan Benita <ran234@gmail.com>2017-10-17 11:28:00 +0800
committerTim Graham <timograham@gmail.com>2017-10-28 20:33:42 -0400
commit03049fb8d96ccd1f1ed0285486103542de42faba (patch)
tree243c0b4cc9b622a47ce7a665d36d8b4ab4973a0d /django/db/models/sql
parent56b364bacca0d6a6cd8fbcd93aeb49f3ad46e58c (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.py13
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: