我创建了一个简单的 Django 数据模型,它使用 Django Simple-History 进行审计:
from django.db import models
from simple_history.models import HistoricalRecords
class AuditedModel(models.Model):
history = HistoricalRecords(inherit=True)
为了 DRY,我试图利用 Simple-History 的history_date
&history_user
属性来代替添加created_at
和created_by
属性。我添加了几个属性来简化访问这些属性的历史记录,如下所示:
@property
def created_date(self):
return self.history.earliest().history_date
@property
def created_by(self):
return self.history.earliest().history_user
当我使用实例时,这很好用。现在,当我尝试按history_date
or过滤查询集时遇到了问题history_user
。例如,我可以通过执行以下操作过滤过去 24 小时内创建的对象:
queryset = AuditedModel.objects.all()
queryset.filter(
uuid__in=AuditedModel.history.annotate(
created_date=Min('history_date'),
).filter(
created_date__gte=timezone.now() - relativedelta(days=1)
).values_list(
'uuid', flat=True
)
)
但是,我无法弄清楚如何过滤AuditedModel
多个属性。最终,我想获得一个带有由特定用户创建的新实例的查询集。
就像是:
queryset.filter(
uuid__in=AuditedModel.history.annotate(
created_date=Min('history_date'),
).filter(
created_date__gte=timezone.now() - relativedelta(days=1)
).values_list(
'uuid', flat=True
),
history__history_user=request.user
)
这不起作用,因为history
无法解决,但它说明了(我希望)我想要达到的目标。
有没有人以这种方式使用简单历史,他们是否可以推动我朝着正确的方向解决这个问题?在这一点上,我正在讨论用适当的字段替换我的created_by
和created_at
属性,因为我看不到替代方案,但感觉不对。