Django, возвращающий сериализованные данные из объекта версии django-reversion в исходный объект, работает крайне медленно

Я работаю с реверсией django, чтобы сохранить версии объекта, а затем вернуть набор запросов со всеми объектами, которые относятся к какому-либо состоянию даты.

revert Метод не подходит для меня, потому что он влияет на исходные данные в базе данных. Поэтому для достижения цели я создал BaseModel Класс, где предоставляется дополнительная функциональность.

С помощью приведенного ниже кода я могу получить набор запросов объектов, которые соответствуют некоторой дате, без фактического изменения исходных данных в базе данных:

import reversion
import datetime

selected_datetime = datetime.datetime(2017, 11, 22, 23, 59, 59)


class BaseModelQuerySet(models.QuerySet):
    def get4date(self, DateTime):
        ex_id = []
        if self.exists():
            for obj in self:
                check = obj.get4date(DateTime)
                if check is None:
                    ex_id.append(obj.id)
        return self.exclude(id__in = ex_id)


class BaseModelManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().get4date(selected_datetime)


class BaseModel(models.Model):
    objects = BaseModelManager.from_queryset(BaseModelQuerySet)()

    def get4date(self, DateTime):
        # find the most recent version for a given date:
        versions = Version.objects.get_for_object(self).filter(revision__date_created__lte=DateTime)
        if versions.exists():
            version = versions.first()
            for k,v in self.__dict__.items():
                if k in version.field_dict and k != "id":
                    continue
            return self
        return None             

    def save(self, *args, **kwargs):
        with reversion.create_revision():
            super().save(*args, **kwargs)

    class Meta:
        abstract = True

Затем я могу сделать что-то вроде кода ниже в models.py:

@reversion.register
class ModelOne(BaseModel):
    ...fields


@reversion.register
class ModelTwo(BaseModel):
    modelone = models.ForeignKey(ModelOne)


@reversion.register
class ModelThree(BaseModel):
    modeltwo = models.ForeigKey(ModelTwo)

У меня есть страница, где, например, все объекты ModelOne отображаются. И при таком подходе эта страница загружается чрезвычайно долго (около минуты).

Когда я комментирую эту часть:

def get4date(self, DateTime):
    # find the most recent version for a given date:
    # versions = Version.objects.get_for_object(self).filter(revision__date_created__lte=DateTime)
    # if versions.exists():
        # version = versions.first()
        # for k,v in self.__dict__.items():
            # if k in version.field_dict and k != "id":
                # continue
        # return self
    # return None
    return self

все начинает работать как обычно, однако с этим фрагментом кода в оболочке django все работало просто отлично.

Я не могу понять, в чем причина такого поведения? Любое предложение?

Заранее спасибо за подсказку!

0 ответов

Другие вопросы по тегам