Как собрать в единый набор запросов в Django? - PullRequest
4 голосов
/ 18 января 2010

Краткое описание : учитывая набор запросов myQueryset, как выбрать max("myfield") без фактического извлечения всех строк и выполнения max в python?

Лучшее, что я могу придуматьиз это max([r["myfield"] for r in myQueryset.values("myfield")]), что не очень хорошо, если есть миллионы строк.

Длинное описание : Скажем, у меня есть две модели в моем приложении Django, Город и Страна.Город имеет поле внешнего ключа для страны:

class Country(models.Model):
    name = models.CharField(max_length = 256)

class City(models.Model):
    name = models.CharField(max_length = 256)
    population = models.IntegerField()
    country = models.ForeignKey(Country, related_name = 'cities')

Это означает, что для экземпляра страны доступно .cities.Допустим, теперь я хочу написать метод для страны под названием highest_city_population, который возвращает население крупнейшего города.Исходя из опыта LINQ, мой естественный инстинкт - попробовать myCountry.cities.max('population') или что-то в этом роде, но это невозможно.

1 Ответ

7 голосов
/ 18 января 2010

Использование Агрегирование (новое в Django 1.1). Вы используете это так:

>>> from django.db.models import Max
>>> City.objects.all().aggregate(Max('population'))
{'population__max': 28025000}

Чтобы получить наибольшую численность City для каждого Country, я думаю, вы могли бы сделать что-то вроде этого:

>>> from django.db.models import Max
>>> Country.objects.annotate(highest_city_population = Max('city__population'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...