diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/base.py | 14 |
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] |
