Я пытаюсь оптимизировать свои наборы запросов.Я широко использую django-simple-history
У меня есть следующие модели, в которых у меня есть метод, с помощью которого я хочу отслеживать изменения в полях:
class TrackHistoryMixin(models.Model):
history = HistoricalRecords(inherit=True, cascade_delete_history=True)
has_history = models.BooleanField(blank=True, default=False)
class Meta:
abstract = True
@property
def changed_fields(self):
first_record = self.history.last()
latest_record = self.history.latest()
delta = first_record.diff_against(latest_record).changed_fields
no_history_fields = ['from_portal', 'has_history', 'document']
for field in no_history_fields:
try:
delta.remove(field)
except ValueError:
pass
return delta
@property
def old_portal_values(self):
if self.changed_fields:
old_object = self.history.last().__dict__
old_portal_values = dict()
for field in self.changed_fields:
old_portal_values.update({field: old_object[field]})
return old_portal_values
Проблема с производительностью заключается в том, что я не могу использовать select_related
или prefetch_related
с полем истории выше.Таким образом, когда я загружаю экземпляр модели, которая наследуется от TrackHistoryMixin, и мне нужно взаимодействовать с полем истории, он попадает в базу данных.
Лучшее, что я мог сделать в своих шаблонах, это то, что дляв каждой записи я помещаю поле истории в переменную с {% with variable=object.history %}
.Но, учитывая, что у меня есть многочисленные записи, производительность все еще страдает.
Как я могу предварительно выбрать такое поле, чтобы при получении набора запросов также загружались все данные, относящиеся к истории?
Явосприимчивы к другим предложениям по производительности, а также.
PS Я вызываю метод old_portal_values
в TrackChangesMixin в своих шаблонах для каждой записи.