Обновить сразу несколько объектов в Django?
Я использую Django 1.9. У меня есть таблица Django, которая представляет значение определенной меры по организации по месяцам с необработанными значениями и процентилями:
class MeasureValue(models.Model):
org = models.ForeignKey(Org, null=True, blank=True)
month = models.DateField()
calc_value = models.FloatField(null=True, blank=True)
percentile = models.FloatField(null=True, blank=True)
Обычно их около 10000 в месяц. Мой вопрос о том, могу ли я ускорить процесс установки значений на моделях.
В настоящее время я вычисляю процентили, извлекая все значения мер за месяц, используя запрос фильтра Django, преобразовывая его в фрейм данных pandas, а затем используя scipy's.rankdata
установить ранги и процентили. Я делаю это, потому что панды иrankdata
эффективны, способны игнорировать нулевые значения и способны обрабатывать повторяющиеся значения так, как я хочу, поэтому я доволен этим методом:
records = MeasureValue.objects.filter(month=month).values()
df = pd.DataFrame.from_records(records)
// use calc_value to set percentile on each row, using scipy's rankdata
Однако затем мне нужно извлечь каждое значение процентиля из фрейма данных и установить его обратно на экземпляры модели. Прямо сейчас я делаю это, перебирая строки данных и обновляя каждый экземпляр:
for i, row in df.iterrows():
mv = MeasureValue.objects.get(org=row.org, month=month)
if (row.percentile is None) or np.isnan(row.percentile):
row.percentile = None
mv.percentile = row.percentile
mv.save()
Это неудивительно довольно медленно. Есть ли эффективный способ Django ускорить его, сделав запись в одну базу данных вместо десятков тысяч? я имеюпроверил документацию, но не вижу никого.