DECLARE
@Main TABLE
(
[name] VARCHAR(50),
trip_id INT
);
INSERT INTO @Main
(
[name],
trip_id
)
VALUES
(
'Jim', 1
),
(
'Ian', 2
),
(
'Susan', 2
);
-- Option 1
SELECT
[name],
trip_id,
COUNT(*) OVER () AS ct
FROM
@Main;
-- Option 2
SELECT
[name],
trip_id,
(
SELECT
COUNT(*)
FROM
@Main
)
ct
FROM
@Main;
-- Option 3
SELECT
[name],
trip_id,
v.ct
FROM
@Main
CROSS APPLY
(
SELECT
COUNT(*) FROM @Main
) v (ct);
-- Option 4
SELECT
t1.[name],
t1.trip_id,
t2.ct
FROM
@Main t1
JOIN
(
SELECT
COUNT(*) ct
FROM
@Main
) t2
ON 1 = 1;
-- Option 5
SELECT
t1.[name],
t1.trip_id,
t2.ct
FROM
@Main t1
CROSS JOIN
(
SELECT
COUNT(*) ct
FROM
@Main
) t2;
См. this . Ваш код будет примерно таким:
from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}
Вы также можете использовать это в существующих наборах запросов:
from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}
Если вам нужен экземпляр модели, содержащий это максимальное значение, то опубликованный вами код, вероятно, является лучшим способом сделать это:
arg = args.order_by('-rating')[0]
Обратите внимание, что это приведет к ошибке, если набор запросов пуст, т. Е. Если ни один аргумент не соответствует запросу (поскольку часть [0]
вызовет ошибку IndexError
). Если вы хотите избежать такого поведения и вместо этого просто вернуть None
в этом случае, используйте .first ()
:
arg = args.order_by('-rating').first() # may return None