|
@@ -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):
|
|
|
|
|
|
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]
|