Django: предварительно выбрать поле пользовательской модели (django-simple-history) - оптимизация производительности - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь оптимизировать свои наборы запросов.Я широко использую 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 в своих шаблонах для каждой записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...