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 все работало просто отлично.
Я не могу понять, в чем причина такого поведения? Любое предложение?
Заранее спасибо за подсказку!