summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2019-08-30 10:28:18 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-09-23 11:45:33 +0200
commit2362f2726558dd0cc6e447878545dd3ddbd9b633 (patch)
tree92bf0ca38ac697c895af7405e0c8b15374187e87 /django
parent368832e80308c15df7082ea4c42a2381529b4471 (diff)
[3.0.x] Fixed #13296 -- Fixed ordering by Options.order_with_respect_to after deleting objects.
Thanks Simon Meers for the original patch. Backport of f97bbad908df128189eff77d98af9a25ed1ecf23 from master
Diffstat (limited to 'django')
-rw-r--r--django/db/models/base.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 4f3145ebc2..3ce711f3f1 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -15,13 +15,16 @@ from django.db import (
DEFAULT_DB_ALIAS, DJANGO_VERSION_PICKLE_KEY, DatabaseError, connection,
connections, router, transaction,
)
-from django.db.models import NOT_PROVIDED
+from django.db.models import (
+ NOT_PROVIDED, ExpressionWrapper, IntegerField, Max, Value,
+)
from django.db.models.constants import LOOKUP_SEP
from django.db.models.constraints import CheckConstraint, UniqueConstraint
from django.db.models.deletion import CASCADE, Collector
from django.db.models.fields.related import (
ForeignObjectRel, OneToOneField, lazy_related_operation, resolve_relation,
)
+from django.db.models.functions import Coalesce
from django.db.models.manager import Manager
from django.db.models.options import Options
from django.db.models.query import Q
@@ -869,9 +872,12 @@ class Model(metaclass=ModelBase):
# autopopulate the _order field
field = meta.order_with_respect_to
filter_args = field.get_filter_kwargs_for_object(self)
- order_value = cls._base_manager.using(using).filter(**filter_args).count()
- self._order = order_value
-
+ self._order = cls._base_manager.using(using).filter(**filter_args).aggregate(
+ _order__max=Coalesce(
+ ExpressionWrapper(Max('_order') + Value(1), output_field=IntegerField()),
+ Value(0),
+ ),
+ )['_order__max']
fields = meta.local_concrete_fields
if not pk_set:
fields = [f for f in fields if f is not meta.auto_field]