summaryrefslogtreecommitdiff
path: root/django/db/models
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models')
-rw-r--r--django/db/models/query.py3
-rw-r--r--django/db/models/sql/compiler.py13
-rw-r--r--django/db/models/sql/query.py1
3 files changed, 13 insertions, 4 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 5c70229263..07d6ffd4ca 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1018,7 +1018,7 @@ class QuerySet:
return self
return self._combinator_query('difference', *other_qs)
- def select_for_update(self, nowait=False, skip_locked=False, of=()):
+ def select_for_update(self, nowait=False, skip_locked=False, of=(), no_key=False):
"""
Return a new QuerySet instance that will select objects with a
FOR UPDATE lock.
@@ -1031,6 +1031,7 @@ class QuerySet:
obj.query.select_for_update_nowait = nowait
obj.query.select_for_update_skip_locked = skip_locked
obj.query.select_for_update_of = of
+ obj.query.select_for_no_key_update = no_key
return obj
def select_related(self, *fields):
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index c368a59226..29e33c075f 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -546,19 +546,26 @@ class SQLCompiler:
nowait = self.query.select_for_update_nowait
skip_locked = self.query.select_for_update_skip_locked
of = self.query.select_for_update_of
- # If it's a NOWAIT/SKIP LOCKED/OF query but the backend
- # doesn't support it, raise NotSupportedError to prevent a
- # possible deadlock.
+ no_key = self.query.select_for_no_key_update
+ # If it's a NOWAIT/SKIP LOCKED/OF/NO KEY query but the
+ # backend doesn't support it, raise NotSupportedError to
+ # prevent a possible deadlock.
if nowait and not self.connection.features.has_select_for_update_nowait:
raise NotSupportedError('NOWAIT is not supported on this database backend.')
elif skip_locked and not self.connection.features.has_select_for_update_skip_locked:
raise NotSupportedError('SKIP LOCKED is not supported on this database backend.')
elif of and not self.connection.features.has_select_for_update_of:
raise NotSupportedError('FOR UPDATE OF is not supported on this database backend.')
+ elif no_key and not self.connection.features.has_select_for_no_key_update:
+ raise NotSupportedError(
+ 'FOR NO KEY UPDATE is not supported on this '
+ 'database backend.'
+ )
for_update_part = self.connection.ops.for_update_sql(
nowait=nowait,
skip_locked=skip_locked,
of=self.get_select_for_update_of_arguments(),
+ no_key=no_key,
)
if for_update_part and self.connection.features.for_update_after_from:
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 375e22c4de..ce18098fd2 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -189,6 +189,7 @@ class Query(BaseExpression):
self.select_for_update_nowait = False
self.select_for_update_skip_locked = False
self.select_for_update_of = ()
+ self.select_for_no_key_update = False
self.select_related = False
# Arbitrary limit for select_related to prevents infinite recursion.