Самый эффективный способ запросить модель Django по отдельным группам и выполнить итерации по этим подмножествам запросов - PullRequest
0 голосов
/ 31 марта 2020

База данных MySQL Я пытаюсь перебрать все поля в моей модели, сгруппировав их по полю date_created и повторив каждый запрос. Я был в состоянии сделать это, но мой метод кажется неэффективным. Есть ли лучший, более чистый способ? Ожидается, что база данных достигнет к северу от 50 000 строк с уникальными датами до года прошлого года. Я планирую выполнять сложную работу в рамках каждого запроса date_created подзапросов, и мне потребуется доступ к другим полям в модели. Я планирую использовать данные в основном для отображения диаграмм и прочего на веб-странице, используя Django и Heroku.

    data = model.objects.all()

    distinct_dates = data.values('date_created').distinct()

    for each_date in distinct_dates:
        data.filter(date_created=each_date['date_created'])

Значения each_date будут каждой уникальной датой, связанной с моделью и этим полем

Вот моя модель

class Model(models.Model):
    expansion = models.CharField(max_length=255, default='', db_index=True)
    value = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    date_created = models.DateField(db_index=True)

    class Meta:
        ordering = ['date_created', ]

1 Ответ

2 голосов
/ 31 марта 2020

Ответ на этот вопрос зависит от многих факторов, некоторые из которых следующие:

  1. База данных, которую вы используете
  2. Сеть между базой данных и вашим приложением
  3. Количество строк данных
  4. Количество уникальных дат в вашем наборе данных
  5. Что вы планируете делать с данными впоследствии
  6. Подробная информация о приложение

Рассмотрим следующие варианты использования:

  1. Если все, что вы делаете, это выборка данных и ничего с этим не делаете, то большую часть времени выбирает все данные сразу быстрее.
data = model.objects.all()
Если вы планируете просто получать агрегированные значения за дату, то быстрее сделать следующее:
data_by_dates = model.order_by('date_created').values(
    'date_created'
).annotate(
    count=Count('date_created'), total=Sum('amount')
)
Если у вас есть данные за тысячи дат, но данные содержат только несколько строк на дату, и вы собираете строки по дате, то вы также будете подключаться к БД миллион раз. Если у вас есть данные, скажем, всего за 7 дней, но в эту дату есть точка данных в секунду, то вы получите 86400 точек данных, но подключитесь к БД только 7 раз Если у вас есть данные скажем, год, и у вас есть точка данных в секунду, и вы решаете собрать ВСЕ их сразу, тогда это израсходует много памяти сервера. Если вы планируете обрабатывать эти данные в чистом python, то это также будет съедать ваш процессор.

Я мог бы придумать еще много вариантов использования, но если вы не знаете, что на самом деле пытаетесь сделать, и не знаете контекста, трудно сказать, что является «наиболее эффективным». "путь есть.

...